Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 枚举常数的平移极限_C_Enums_Standards_C89_Ansi C - Fatal编程技术网

C 枚举常数的平移极限

C 枚举常数的平移极限,c,enums,standards,c89,ansi-c,C,Enums,Standards,C89,Ansi C,我有一个非常具体的问题,关于枚举常量的C(定义见ANSI/ISO 9899:X标准系列)的转换限制 我想列举大约一千个可单独识别的数据源。我还想尊重C标准的最小转换限制,因为实际限制是由实现定义的,超过这些限制就是未定义的行为(请参阅) 我知道,对于同一个枚举(C90:127)中枚举常量的数量、同一块(C90:127)中指定的标识符的数量以及转换单元(C90:511)中的外部标识符,存在转换限制 我认为枚举常量没有链接(请纠正我),当然我可以将它们放在块范围之外。。。因此,将任何转换限制约束放在

我有一个非常具体的问题,关于枚举常量的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)也有翻译限制。我将被迫以复杂的方式取消定义,可能是使用复杂的包含模式。

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

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