نوع قاعدة التعداد المتجاوز باستخدام pragma أو تغيير الكود

StackOverflow https://stackoverflow.com/questions/2521200

  •  22-09-2019
  •  | 
  •  

سؤال

مشكلة:

أنا أستخدم قاعدة رمز C/C ++ الكبيرة التي تعمل على مجمعات GCC & Visual Studio حيث يكون نوع قاعدة التعداد افتراضيًا 32 بت (نوع صحيح).

يحتوي هذا الرمز أيضًا على الكثير من التجميع المضمّن + المضمّن الذي يعامل التعداد كنوع عدد صحيح ويتم استخدام بيانات التعداد كعلامات 32 بت في كثير من الحالات.

عند تجميع هذا الرمز باستخدام برنامج التحويل البرمجي لـ RealView ARM RVCT 2.2 ، بدأنا في الحصول على العديد من المشكلات لأن RealView Compiler يقرر نوع قاعدة التعداد تلقائيًا بناءً على القيمة التي يتم تعيين التعداد عليها. http://www.keil.com/support/man/docs/armccref/armccref_babjddhe.htm

علي سبيل المثال،

النظر في التعداد أدناه ،

enum Scale {
    TimesOne, //0
    TimesTwo, //1
    TimesFour, //2
    TimesEight, //3
};

يتم استخدام هذا التعداد كعلم 32 بت. لكن برنامج التحويل البرمجي يحسنه إلى نوع Char غير الموقّع لهذا التعداد.

لا يمثل خيار برنامج التحويل البرمجي-ENUM_IS_INT حلاً جيدًا لحالتنا ، لأنه يحول جميع التعداد إلى 32 بت مما سيؤدي إلى تفاعل أي رمز خارجي تم تجميعه بدون-enum_is_int.

هذا تحذير وجدته في دليل RVCT Compilers & Library ،

لا ينصح بخيار-ENUM_IS_INT للاستخدام العام وليس مطلوبًا للمصدر المتوافق مع ISO. الكود المترجم بهذا الخيار غير متوافق مع ABI لهندسة الذراع (المعيار الأساسي) [BSABI] ، وقد يؤدي الاستخدام غير الصحيح إلى فشل في وقت التشغيل. لا يتم دعم هذا الخيار بواسطة مكتبات C ++.

سؤال

كيفية تحويل نوع قاعدة التعداد (عن طريق التغييرات المرمزة باليد) لاستخدام 32 بت دون التأثير على طلب القيمة؟

enum Scale {
    TimesOne=0x00000000,
    TimesTwo, // 0x00000001
    TimesFour, // 0x00000002
    TimesEight, //0x00000003
};

حاولت التغيير أعلاه. لكن المترجم يحسن هذا أيضًا من أجل حظنا السيئ. :(

هناك بعض بناء الجملة في .NET مثل

مقياس التعداد: int

هل هذا معيار ISO C ++ وترجم الذراع يفتقر إليه؟

لا يوجد #Pragma للتحكم في هذا التعداد في برنامج التحويل البرمجي ARM RVCT 2.2. هل هناك أي براغما خفية متاحة؟

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

المحلول

أعلم أن الكثير من رؤوس Windows تستخدم ما يلي:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};

نصائح أخرى

في C ++ 11:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

Visual Studio 2012 و GCC 4.4.6 مع خيار -std = c ++ 0x يدعمان هذا (قد يتم ذلك الإصدارات السابقة أيضًا.)

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