سؤال

يتعلق هذا السؤال بنظام التشغيل Symbian OS، ومع ذلك أعتقد أن المخضرم في C/C++ يمكنه مساعدتي أيضًا.أقوم بتجميع مكتبة مفتوحة المصدر لنظام التشغيل Symbian OS.باستخدام مترجمGCE يتم تجميعه بدون أخطاء (بعد بعض الترقيع :)).لقد قمت بتغيير برنامج التحويل البرمجي إلى ARMV5 والآن لدي أخطاء متعددة في تعريفات البنيات الثابتة، على سبيل المثال:لدي هيكل:

typedef struct Foos{
    int a;
    int b;
} Foos;

والتعريف التالي لبنية من النوع Foos

static const Foos foo = {
    .a = 1,
    .b = 2,
};

ليس لدى دول مجلس التعاون الخليجي مشكلة في هذا الأمر ويظهر خطأ ARMV5 "تعبير متوقع" على ".a = 1, .b = 2,".مما بحثت عنه في Google بخصوص هذا أعتقد أن هذه الطريقة يجب أن تكون قانونية في C ولكنها غير قانونية في C++، إذا كان الأمر كذلك، فما هي احتمالات الإعلان عن بنيات const في C++؟إذا لم يكن الأمر كذلك، فسيكون موضع تقدير أي مساعدة أخرى.

شكرا لك مقدما :)

هل كانت مفيدة؟

المحلول

static const struct Foos foo = { 1, 2 };

ويجمع مع كل ز ++ ودول مجلس التعاون الخليجي.

هل يمكن فكورسي، كما onebyone يشير، تحديد المنشئ:

typedef struct Foos {
    int a;
    int b;
    Foos(int a, int b) : a(a), b(b) {}
};

ما كنت initalize مثل ذلك:

static const struct Foos foo(1, 2);

نصائح أخرى

وهذا C99 القانوني، ولكن ليس C89 قانوني أو C ++. يفترض كنت تجميع هذا النحو C ++، حتى إذا كنت تستخدم خيارات مترجم لفرض معايير الامتثال، ثم GCCE سيرفض ذلك أيضا.

ويمكنك القيام foo = {1, 2}; في C أو C ++. ومن الواضح أن تخسر صالح أسماء الحقول يجري هناك حق: عليك أن تعتمد على الحصول على أمر الحق

وخيار جيد آخر في C ++ هو تعريف منشئ للبنية الخاص بك، وتهيئة مع static const Foos foo(1,2);. هذا لا يمنع البنية كونها POD، ومع ذلك، لذلك لا يمكن أن تجعل من نفس الافتراضات حول تمثيلها في الذاكرة.

مجرد ملاحظة ذلك بيانات ثابتة قابلة للكتابة غير مدعوم في ملفات DLL في بعض إصدارات Symbian.قد لا يؤثر ذلك على ما تفعله لأن الأمثلة الخاصة بك ثابتة أو ربما تدعم فقط Symbian v8.1b أو الإصدارات الأحدث.

اعتقدت أنني سأشير إلى ذلك لأنني وقعت في هذا الفخ مرة واحدة.

اقتباس من الرابط أعلاه:

دعم للبيانات الثابتة العالمية القابلة للكتابة على Symbian OS

يدعم Symbian OS البيانات الثابتة العالمية القابلة للكتابة في EXES على جميع الإصدارات والأجهزة.

تدعم إصدارات Symbian OS بناءً على kernel eka2 (8.1b ثم) WSD في DLLs على الأجهزة المستهدفة.لا تدعم الإصدارات 8.1a وقبل ذلك ، استنادًا إلى kernel eka1 ، العالمي WSD في DLLs.

والتدوين نقطة الاسلوب هو أعتقد صالح في ANSI C99. لا يصح هو ANSI C89. تقريبا كل المجمعين C لم تنفذ C99.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top