C++中一行上有多个预处理程序指令

duk*_*ave 12 c++ c-preprocessor

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

这样的一行看起来像这样:

#define foo #ifdef foo #define bar #endif
Run Code Online (Sandbox Code Playgroud)

这种线的语义是什么?

此外,是否有任何指令组合在一条线上无法构建?

如果这是特定于编译器的,则欢迎使用VC++和GCC答案.

Jam*_*lis 13

预处理指令必须以换行符终止,因此这实际上是一个预处理指令,它定义了一个类似于对象的宏foo,它扩展为以下标记序列:

# ifdef foo # define bar # endif
Run Code Online (Sandbox Code Playgroud)

以后foo在源中使用该名称(直到#undef编辑)将扩展为此,但在扩展宏之后,生成的标记不会被评估为预处理指令.

这不是特定于编译器的; 此行为由C和C++标准定义.


Mar*_*k B 7

预处理程序指令与语言语句略有不同,语句语句由;空格终止并使用空格来分隔标记.对于预处理器,指令由换行符终止,因此无法执行您尝试使用C++语言本身的操作.

您可以模拟这种方法的一种方法是将所需的行放入单独的头文件中,然后将#include其放在您想要的位置.单独的标题仍然必须在一行上包含每个指令,但是包含它的点只是一行,有效地执行您的要求.

另一种实现此类目标的方法是在使用C++编译器进行编译之前,使用一个前C++文件,使用外部进程处理成C++源文件.这可能比它的价值更麻烦.