gpt4 book ai didi

c - 枚举常量的翻译限制

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:39 27 4
gpt4 key购买 nike

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

我有几千个可单独识别的数据源,我想列举一下。此外,我想尊重 C 标准的最小翻译限制,因为实际限制是实现定义的,超过这些限制是未定义的行为(参见 Is it undefined behavior to exceed translation limits and are there checker tools to find it?)。

我知道对于同一枚举中枚举常量的数量 (C90: 127)、同一 block 中指定的标识符数量 (C90: 127) 以及翻译单元中的外部标识符 (C90: 511).

我认为枚举常量没有链接(请纠正我),当然我可以将它们放在 block 范围之外......所以将任何翻译限制约束到以下模式(除了整数类型的限制之外)目标平台,当然还有单个枚举中常量的数量)——如果是,为什么?

 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 - 枚举常量的翻译限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com