2013-01-15 54 views
0

我正在寻找在两个阶段实现C预处理器,其中第一阶段将源文件转换为预处理标记数组。这对简单性和性能很有好处,因为标题文件被项目中的多个文件包含时,标记化工作不需要重做。预处理#(字符串化)操作符和空白

的障碍:

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

根据标准,输出应该是:

a+b 
a + b 

即约构成令牌是否由空格隔开的信息应该被保留。这将需要两相设计被废弃。

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

是否有任何现有的代码确实取决于此操作符标准所规定的确切行为?

+1

为什么会阻止两相设计?你只需要用空格来表示空白。 – delnan

+0

是的,但宏调用不能通过本地检查来识别,因此代码中任何位置的标记之间的空格都必须表示为空白标记;原则上可以这样做,但会破坏两相设计的优点。 – rwallace

回答

1

您可能想看看LCC编译器的预处理器,它是编译器课程的ANSI C编译器的示例。另一个预处理器是MCPP。 C/C++预处理相当棘手,如果你坚持它,确保至少得到相关标准的草案,并在某处盗用测试套件。