我正在考虑分两个阶段实现 C 预处理器,其中第一阶段将源文件转换为预处理标记数组。这将有利于简单性和性能,因为当项目中的多个文件包含头文件时,不需要重做标记化工作。
障碍:
#define f(x) #x
main() {
puts(f(a+b));
puts(f(a + b));
}
根据标准,输出应该是:
a+b
a + b
即有关组成标记是否由空格分隔的信息应该被保留。这将需要废弃两相设计。
到目前为止,我所看到的# 运算符的使用实际上并不需要这个,例如,如果输出总是不管源文件中的组成标记是否被空格分隔,它assert
仍然可以正常工作。a + b
是否有任何现有代码依赖于该操作员标准规定的确切行为?