枚举常量的平移限制

时间:2015-06-19 16:07:08

标签: c enums standards c89 ansi-c

关于枚举常数,我对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模式。

1 个答案:

答案 0 :(得分:1)

不要求编译器允许程序员定义511个不同的枚举变量,每个变量具有127个不同的值名称,每个名称包含31个字符。即使名称以绝对优化的格式存储,编译器仍然需要大约1.5兆字节来存储所有这些 - 不完全可能在运行在具有64K总RAM和两个360K软盘驱动器的机器上的编译器[源文件如果使用宏扩展生成名称,那么定义所有这些名称可能会少于64K]。请注意,虽然这种机器在1989年一直处于较小的一面,但C通常用在更小的机器上,而且标准的作者并不想禁止这样的实现。

一个好的编译器将允许一定量的标识符存储,并且如果程序超过该限制将中止编译(在不限制单个程序的内存使用的系统上,编译器应将限制设置得足够高,没有现实的程序可以达到它,但是足够低,以至于一个恶意编写的源文件将无法使整个系统崩溃。如果编译器是为具有许多兆字节或千兆字节RAM的系统而设计的,那么标准所建议的限制应该是不是一个因素。会有一些限制,但除非有人触及它,否则可能无法知道它是什么。