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