预处理#(stringizing)运算符和空格

时间:2013-01-15 17:41:39

标签: c macros c-preprocessor

我正在考虑分两个阶段实现C预处理器,第一阶段将源文件转换为预处理标记数组。这对简单性和性能有好处,因为当项目中的多个文件包含头文件时,不需要重做标记化工作。

障碍:

#define f(x) #x
main() {
    puts(f(a+b));
    puts(f(a + b));
}

根据标准,输出应为:

a+b
a + b

即。应该保留关于成分标记是否被空格分隔的信息。这将需要废弃两相设计。

到目前为止,我见过的#运算符的使用实际上并不需要这样,例如如果输出始终为assert,无论成员令牌是否被源文件中的空格分隔,a + b仍然可以正常工作。

是否有任何现有代码依赖于此运算符标准规定的确切行为?

1 个答案:

答案 0 :(得分:1)

您可能希望查看LCC编译器的预处理器,该编译器是作为编译器课程的ANSI C编译器编写的。另一个预处理器是MCPP

C / C ++预处理非常棘手,如果你坚持下去,请确保至少得到相关标准的草稿,并在某处窃取测试套件。