枚举常量的翻译限制
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 的系统设计的,则建议的限制标准不应该是一个因素。会有一些限制,但除非有人击中它,否则可能无法知道它是什么。
我有一个非常具体的问题,关于枚举常量的 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 的系统设计的,则建议的限制标准不应该是一个因素。会有一些限制,但除非有人击中它,否则可能无法知道它是什么。