c/c++语言开发共享如何在C中模拟强类型枚举?

在C ++ 03中,可以通过将其置于类(或命名空间)中来模拟强类型枚举 :

struct MyEnum { enum enumName { VALUE_1 = 1, VALUE_2, }; }; 

并使用它:

 MyEnum::enumName v = MyEnum::VALUE_1; 

是否有可能在C中做类似的事情? 如果有,怎么样?


我试过这样,但当然不起作用:

 struct A { enum aa { V1 = 5 }; }; int main() { A::aa a1 = A::V1; enum A::aa a2 = A::V1; struct A::aa a3 = A::V1; return 0; } 

    这是我的解决方案。 与@ Eric的设计相比有一些优势:

    缺点:

    笔记:

    这是实现(使用-Werror-pedantic编译):

     typedef struct A { char empty[1]; } *A; // we use 'empty' so that we don't get a warning that empty structs are a GNU extension #define A_VALUE_0 ((A) 0x1) #define A_VALUE_1 ((A) 0x2) #define A_VALUE_2 ((A) 0x4) typedef struct B { char empty[1]; } *B; #define B_VALUE_0 ((B) 0x0) #define B_VALUE_1 ((B) 0x1) #define B_VALUE_2 ((B) 0x2) int main() { A a = A_VALUE_0; int equal = (a == A_VALUE_1); // works! int euqal = (a == B_VALUE_1) // doesn't work A flags = A_VALUE_0 | A_VALUE_1; // doesn't work! switch (a) { // doesn't work case A_VALUE_0: puts("value 0"); break; case A_VALUE_1: puts("value 1"); break; case A_VALUE_2: puts("value 2"); break; default: puts("unknown value"); break; } // doesn't work // casting works for assignment: A b = (A) (B_VALUE_2); return 0; } 

    你可以这样做:

     // Declare A to use for an enumeration, and declare some values for it. typedef struct { int i; } A; #define A0 ((A) { 0 }) #define A1 ((A) { 1 }) // Declare B to use for an enumeration, and declare some values for it. typedef struct { int i; } B; #define B0 ((B) { 0 }) #define B1 ((B) { 1 }) void foo(void) { // Initialize A. A a = A0; // Assign to A. a = A1; // Assign a value from B to A. a = B0; // Gets an error. } 

    这给你一些打字,但它可能是一个麻烦,取决于你想用枚举及其值执行的其他操作。

    由于C不提供名称空间,因此您可以使用前缀。

     enum MyEnum { MyEnumA = 1, MyEnumB, MyEnumC }; enum OtherEnum { OtherEnumA = 1, OtherEnumB }; 

    然后,为了简化变量声明,您可以为枚举声明类型,如下所示:

     typedef enum MyEnum MyEnum; typedef enum OtherEnum OtherEnum; 

    最后,我不想允许将OtherEnumB隐式转换为OtherEnumB类型,Clang提供-Wenum-conversion标志(我不认为GCC中有类似的标志)。

     /tmp/test.c:24:20: warning: implicit conversion from enumeration type 'enum OtherEnum' to different enumeration type 'MyEnum' (aka 'enum MyEnum') [-Wenum-conversion] MyEnum value = OtherEnumB; ~~~~~ ^~~~~~~~~~ 1 warning generated. 

    这样做的好处是简单,易于理解,并且与您的(我的,至少)IDE的自动完成function配合良好。

      以上就是c/c++开发分享如何在C中模拟强类型枚举?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560654.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐