0

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

障碍:

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

根据标准,输出应该是:

a+b
a + b

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

到目前为止,我所看到的# 运算符的使用实际上并不需要这个,例如,如果输出总是不管源文件中的组成标记是否被空格分隔,它assert仍然可以正常工作。a + b

是否有任何现有代码依赖于该操作员标准规定的确切行为?

4

1 回答 1

1

您可能想查看LCC编译器的预处理器,它是作为编译器课程的示例 ANSI C 编译器编写的。另一个预处理器是MCPP

C/C++ 预处理是相当棘手的,如果你坚持它,请确保至少获得相关标准的草案,并在某处窃取测试套件。

于 2013-01-20T03:55:46.803 回答