【发布时间】:2011-06-09 10:53:48
【问题描述】:
在讨论一个需要定义大量常量和位模式的项目的设计可能性时,出现的问题是标准编译器可以处理多少个#define?我认为这是一个非常大的数字,但我们很想知道是否存在实际的上限。
【问题讨论】:
标签: visual-c++ gcc c-preprocessor
在讨论一个需要定义大量常量和位模式的项目的设计可能性时,出现的问题是标准编译器可以处理多少个#define?我认为这是一个非常大的数字,但我们很想知道是否存在实际的上限。
【问题讨论】:
标签: visual-c++ gcc c-preprocessor
对于“标准编译器”:
5.2.4.1:“翻译限制”
实施应能够 翻译并执行至少一个 包含至少一个的程序 以下每一项的实例 限制
...
同时有 4095 个宏标识符 在一次预处理中定义 翻译单元
请注意表述要求的方式有点奇怪。实现可以通过拥有一个他们识别和编译为特殊情况的单一“黄金程序”来满足它,尽管这类似于操纵基准。在实践中,您可以将标准解读为,如果您的实现施加了除可用内存之外的限制,那么该限制应该至少为 4095。超过 4095,您在一定程度上依赖于特定于实现的行为.
一些编译器(微软)施加了一些低于标准规定的实现限制。我认为这些都列在 MSDN 上的某个地方,但可能仅适用于 C++。就 C 而言,由于我引用的是 C99,因此它可能与 MSVC 无关。
特别是对于 GCC 和 MSVC,测试给定的实现是否施加了任意限制应该不会太难,也许比找到它更容易记录 :-) 自动生成文件,只包含很长的 @987654321 列表@,看看预处理器对它们做了什么。
【讨论】:
C 预处理器在实际使用之前不会扩展 #define。因此,在典型的实现中,您可能遇到的唯一限制是存储所有内容的内存。但是用于存储宏内部表示的内存基本上最多与编译器读取的文件大小成正比。
(你也可以多次包含文件...)
我猜,您可以通过扩展深度嵌套的宏来进行预处理运行。类似的东西
#define EXP1(X) X X
#define EXP2(X) EXP1(X) EXP1(X)
#define EXP3(X) EXP2(X) EXP2(X)
.
.
#define EXP64(X) EXP63(X) EXP63(X)
EXP64(A)
应该可以解决问题,因为它为您提供了 2^64 份 A 的副本,左右。 AFAIR,这些宏定义甚至在标准规定的范围内。
【讨论】:
EXP(),然后相邻的空格 {sh|c|w} 会粘在一起,编译仍然会爆炸。
我从来没有听说有人用完。永远。
【讨论】: