2010-08-20 42 views
8

一个假设的问题:是否有可能在一行中包含预处理器指令的C++程序?C++中的一行上有多个预处理器指令

这样的阵容是这样的:

#define foo #ifdef foo #define bar #endif 

什么是这样的行的语义?

此外,是否有任何指令组合是不可能在一行上构造的?

如果这是特定于编译器的,那么VC++和GCC答案都是可以的。

回答

11

预处理指令必须由一个新行终止,所以实际上是单个预处理指令,其限定了类似对象的宏命名foo,即扩展到以下令牌序列:

# ifdef foo # define bar # endif 

任何后在源文件中使用名称foo(直到它被#undef编辑)将扩展到此,但在扩展宏之后,结果标记不会被评估为预处理指令。

这不是编译器专用的;此行为由C和C++标准定义。

6

预处理程序指令与语言语句有所不同,语言语句由;终止并使用空格来分隔令牌。在预处理器的情况下,指令被换行符终止,所以不可能做你正在尝试使用C++语言本身的东西。

你可以模拟这种方法的一种方式是把你想要的行放入一个单独的头文件,然后在你想要的地方。单独的头文件仍然必须将每条指令放在一行上,但是包含它的点只是一行,实际上是在做你所要求的内容。

另一种完成此类操作的方法是在编译C++编译器之前,先使用一个外部进程处理成C++源文件。这可能比它的价值更麻烦。