【发布时间】:2010-08-20 15:21:10
【问题描述】:
一个假设的问题:是否有可能让一个包含预处理器指令的 C++ 程序完全放在一行上?
这样的一行应该是这样的:
#define foo #ifdef foo #define bar #endif
这样一行的语义是什么?
另外,有没有不可能在一行上构造的指令组合?
如果这是特定于编译器的,那么欢迎使用 VC++ 和 GCC 的答案。
【问题讨论】:
标签: c++ c-preprocessor
一个假设的问题:是否有可能让一个包含预处理器指令的 C++ 程序完全放在一行上?
这样的一行应该是这样的:
#define foo #ifdef foo #define bar #endif
这样一行的语义是什么?
另外,有没有不可能在一行上构造的指令组合?
如果这是特定于编译器的,那么欢迎使用 VC++ 和 GCC 的答案。
【问题讨论】:
标签: c++ c-preprocessor
预处理指令必须以换行符终止,因此这实际上是一个定义类似对象的宏的单个预处理指令,名为foo,扩展为以下标记序列:
# ifdef foo # define bar # endif
以后在源代码中使用名称 foo(直到它是 #undefed)将扩展为此,但在宏扩展后,生成的标记不会作为预处理指令进行评估。
这不是特定于编译器的;此行为由 C 和 C++ 标准定义。
【讨论】:
预处理器指令与语言语句有些不同,后者以; 终止并使用空格来分隔标记。在预处理器的情况下,指令以换行符终止,因此使用 C++ 语言本身无法执行您尝试的操作。
您可以模拟这种情况的一种方法是将所需的行放入单独的头文件中,然后将#include 放在您想要的位置。单独的标题仍然必须在一行中包含每个指令,但是包含它的点只是一行,有效地按照您的要求进行。
完成类似操作的另一种方法是在使用 C++ 编译器进行编译之前,使用外部进程将其处理为 C++ 源文件的 C++ 前文件。这可能比它的价值更麻烦。
【讨论】: