关于枚举常数,我对C(在ANSI / ISO 9899:X标准系列中定义)的转换限制有一个非常具体的问题。
我有几千个可单独识别的数据源,我想枚举。此外,我还要尊重C标准的最小转换限制,因为实际限制是实现定义的,超过这些是未定义的行为(参见Is it undefined behavior to exceed translation limits and are there checker tools to find it?)。
我知道同一个枚举中的枚举常量数(C90:127),同一个块(C90:127)中指定的标识符数和翻译单元中的外部标识符(C90: 511)。
我认为枚举常量没有链接(请更正我),当然我可以将它们放在块范围之外......所以将任何转换限制约束放到下面的模式中(除了整数类型的限制之外)目标平台,当然还有单个枚举中常量的数量) - 如果是,为什么?
MyEnumeration.h
---------------
enum e1
{
VAL11 = 0,
VAL12,
/* ... */
VAL_1N,
END1 = VAL_1N
};
enum e2
{
VAL21 = END1,
VAL22,
/* ... */
VAL_2N,
END2 = VAL_2N
};
/* ... */
enum eN
{
VALN1 = ENDN_1,
VALN2,
/* ... */
VAL_NN,
ENDN = VAL_NN
};
#define NUM_ENUM ENDN
注意:切换到#define不会有帮助,因为对定义的marco标识符(C90:1024)也有翻译限制。我会被迫以复杂的方式#undef,也许是复杂的#include模式。
答案 0 :(得分:1)
不要求编译器允许程序员定义511个不同的枚举变量,每个变量具有127个不同的值名称,每个名称包含31个字符。即使名称以绝对优化的格式存储,编译器仍然需要大约1.5兆字节来存储所有这些 - 不完全可能在运行在具有64K总RAM和两个360K软盘驱动器的机器上的编译器[源文件如果使用宏扩展生成名称,那么定义所有这些名称可能会少于64K]。请注意,虽然这种机器在1989年一直处于较小的一面,但C通常用在更小的机器上,而且标准的作者并不想禁止这样的实现。
一个好的编译器将允许一定量的标识符存储,并且如果程序超过该限制将中止编译(在不限制单个程序的内存使用的系统上,编译器应将限制设置得足够高,没有现实的程序可以达到它,但是足够低,以至于一个恶意编写的源文件将无法使整个系统崩溃。如果编译器是为具有许多兆字节或千兆字节RAM的系统而设计的,那么标准所建议的限制应该是不是一个因素。会有一些限制,但除非有人触及它,否则可能无法知道它是什么。