![]() |
1
32
这需要在外部文件中定义水果。 这将是 水果 :
这就是 水果水果 :
只要值从0开始并且是连续的… 更新: 如果需要非连续值,请使用C99将此解决方案与Richard Pennington的解决方案混合。比如说:
|
![]() |
2
9
我发现的C99方法有助于减少错误:
您可以添加枚举,即使在中间,也不能破坏旧的定义。当然,对于您忘记的值,您仍然可以获得空字符串。 |
![]() |
3
4
我过去所做的一个技巧是添加一个额外的枚举,然后执行编译时断言(例如 Boost's )要确保两者保持同步:
这至少可以防止有人忘记添加到枚举和名称数组中,并在尝试编译时立即通知他们。 |
![]() |
4
4
关于宏解决方案的一个注释-枚举器不需要单独的文件。只需使用另一个宏:
(不过,我可能会去掉逗号,并根据需要将它们合并到水果宏中。) |
![]() |
5
3
如果你做了这样的事怎么办?
然后,如果向Fruit枚举添加一个新条目,编译器应该会抱怨数组的初始值设定项中没有足够的条目,因此您将被迫向数组添加一个条目。 因此,它可以防止数组大小错误,但不能帮助您确保字符串是正确的。 |
![]() |
6
1
可以为它创建类结构:
然后你可以有一个需要水果的功能,它甚至更安全。
它的大小比一个枚举大2倍。但很可能这并不重要。 |
![]() |
7
1
正如其他回答这个问题的人所展示的那样,单独使用C预处理器并没有一种真正干净的方法(“D.R.Y”)。问题是,您需要定义一个枚举大小的数组,该数组包含与每个枚举值对应的字符串,而C预处理器不够智能,无法做到这一点。我要做的是创建这样的文本文件:
这里是%的标记分隔符。 然后是一个Perl脚本,其工作部分如下,
读取此文件并写入头文件:
C文件:
使用顶部的输入文件。它还通过计算输入行来计算这里的数字26。(事实上有26种可能的状态。)
然后使用
|
![]() |
8
1
总的来说,我不喜欢宏观解决方案,尽管我承认在那里很难避免它们。 我个人选择了一个自定义类来包装我的枚举。目标是提供比传统的枚举(比如迭代)更多的东西。
在封面下面,我用
当然,问题是定义,因为我必须首先声明枚举,然后映射它…但这就是你使用它们的代价。
另外,我使用的不是真正的枚举,而是指向映射(在封面下)的常量迭代器来表示枚举值(使用
|
![]() |
9
1
看看MetaResc库 https://github.com/alexanderchuranov/Metaresc 它为类型声明提供接口,该声明还将为该类型生成元数据。基于元数据,您可以轻松地序列化/反序列化任何复杂的对象。开箱即用,您可以序列化/反序列化XML、JSON、XDR、类似Lisp的表示法、C-init表示法。 下面是一个简单的例子:
此程序将输出
图书馆为最新的GCC和Clang工作良好。 |
![]() |
10
1
也有 Better Enums ,它是一个只需要C++ 11的头文件库(文件),并在BSD软件许可证下进行许可。官方说明:
以下是官网的代码示例:
它看起来很有前途,尽管我还没有测试过。此外,C++有很多(自定义的)反射库。我希望类似的东西 更好的枚举 迟早会成为标准模板库(STL)的一部分(或者至少是Boost)。 |
![]() |
H.v.M. · 为最后一个枚举值指定不同的变量值 3 年前 |
|
JimmyDiJim · 在声明后定义枚举变量 7 年前 |
![]() |
Eli K · 语法错误,插入“{”以完成枚举体(在类的末尾) 7 年前 |
![]() |
Vivek Shukla · 在中间添加枚举 7 年前 |
![]() |
DannyD · 如何访问typescript中的枚举名称 7 年前 |