توقيع التعداد في C/C99/C ++/C ++ X/GNU C/GNU C99
سؤال
هو enum
اكتب موقعة أو غير موقعة؟ هل تختلف توقيع التعداد في C/C99/ANSI C/C ++/C ++ X/GNU C/GNU C99؟
شكرًا
المحلول
يضمن التعداد أن يتم تمثيله بواسطة عدد صحيح ، لكن النوع الفعلي (وتوقيعه) يعتمد على التنفيذ.
يمكنك فرض التعداد ليتم تمثيله بنوع موقّع من خلال إعطاء أحد العدادات قيمة سلبية:
enum SignedEnum { a = -1 };
في C ++ 0x ، يمكن تحديد النوع الأساسي من التعداد بشكل صريح:
enum ShortEnum : short { a };
(C ++ 0x يضيف أيضًا دعمًا للتعدادات المنتشر)
للاكتمال ، سأضيف ذلك في لغة البرمجة C ، الطبعة الثانية., ، يتم تحديد العدادات على أنها نوع int
(ص 215). K&R ليس معيار C ، بحيث لا يكون ذلك معياريًا بالنسبة لمرسلات ISO C ، ولكنه يسبق معيار ISO C ، لذلك فهو مثير للاهتمام على الأقل من وجهة نظر تاريخية.
نصائح أخرى
هذا سؤال قديم ... لكنني اكتشفت هذا:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
يمكنك استخدامه كفهرس غير موقّع 2 بت ، على سبيل المثال:
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
جربته في ARM في مجلس التعاون الخليجي - لا يعمل.
أيضا ، يعرض Windbg structname.i ك رقم, ، ليس كما V0-V3.