2

我有一个关于枚举常量的 C (定义在 ANSI/ISO 9899:X 标准系列中)的翻译限制的非常具体的问题。

我有几千个可单独识别的数据源,我想列举一下。此外,我想尊重 C 标准的最小翻译限制,因为实际限制是实现定义的,超过这些限制是未定义的行为(请参阅是否未定义的行为超出了翻译限制,是否有检查工具可以找到它?)。

我知道同一枚举中的枚举常量数量(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 模式。

4

1 回答 1

1

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

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

于 2016-07-27T15:55:15.267 回答