0
我正在寻找在两个阶段实现C预处理器,其中第一阶段将源文件转换为预处理标记数组。这对简单性和性能很有好处,因为标题文件被项目中的多个文件包含时,标记化工作不需要重做。预处理#(字符串化)操作符和空白
的障碍:
#define f(x) #x
main() {
puts(f(a+b));
puts(f(a + b));
}
根据标准,输出应该是:
a+b
a + b
即约构成令牌是否由空格隔开的信息应该被保留。这将需要两相设计被废弃。
到目前为止我见过的#运算符的用法实际上并不需要这个,例如,如果输出始终为a + b
,则无论组成标记是否被源文件中的空白分隔,assert
仍然可以正常工作。
是否有任何现有的代码确实取决于此操作符标准所规定的确切行为?
为什么会阻止两相设计?你只需要用空格来表示空白。 – delnan
是的,但宏调用不能通过本地检查来识别,因此代码中任何位置的标记之间的空格都必须表示为空白标记;原则上可以这样做,但会破坏两相设计的优点。 – rwallace