枚举常量的翻译限制

Translational Limits on Enum Constants

我有一个非常具体的问题,关于枚举常量的 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 将无济于事,因为定义的宏标识符 (C90: 1024) 也有转换限制。我将被迫以复杂的方式使用#undef,也许使用复杂的#include 模式。

不要求编译器允许程序员定义 511 个不同的枚举变量,每个变量有 127 个不同的值名称,每个名称有 31 个字符。即使名称以绝对最佳的格式存储,编译器仍然需要大约 1.5 兆字节来存储所有这些——对于在总内存为 64K 和两个 360K 软盘驱动器的机器上运行的编译器来说,这不太可能[源文件如果名称是使用宏扩展生成的,那么定义所有这些名称可能会少于 64K]。请注意,虽然这样的机器在 1989 年会偏小,但 C 语言通常用于更小的机器,标准的作者不想禁止这样的实现。

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