一个假设的问题:是否有可能在一行上拥有一个包含预处理器指令的C ++程序?
这样的一行看起来像这样:
#define foo #ifdef foo #define bar #endif
这种线的语义是什么?
此外,是否有任何指令组合在一条线上无法构建?
如果这是特定于编译器的,那么欢迎使用VC ++和GCC答案。
答案 0 :(得分:13)
预处理指令必须以换行符终止,因此这实际上是一个预处理指令,它定义了一个名为foo
的类似对象的宏,它扩展为以下标记序列:
# ifdef foo # define bar # endif
以后在源代码中使用名称foo
(直到它为#undef
)将扩展为此,但在扩展宏之后,生成的标记不会被评估为预处理指令
这不是特定于编译器的;此行为由C和C ++标准定义。
答案 1 :(得分:7)
预处理程序指令与语句语句稍有不同,语句语句由;
终止并使用空格来分隔标记。在预处理器的情况下,指令由换行符终止,因此你不可能尝试使用C ++语言本身。
您可以模拟这种方法的一种方法是将所需的行放入单独的头文件中,然后将#include
放在您想要的位置。单独的标题仍然必须在一行上包含每个指令,但是您包含它的点只是一行,有效地执行您的要求。
另一种实现此类目标的方法是在使用C ++编译器进行编译之前,使用外部进程处理成C ++源文件的预C ++文件。这可能比它的价值更麻烦。
答案 2 :(得分:1)
晚了几年-但这是我每天使用的一种模式:
#ifdef _DEBUG
#define DEBUGTRACE(debuglevel, code) \
if ( traceLevelActive(debuglevel) ) \
{code}
#else
#define DEBUGTRACE(debuglevel, code)
#endif
用法:
DEBUGTRACE(DEBUG_LEVEL2, printf("you are in debug mode"); );
或更详细地说:
DEBUGTRACE(DEBUG_LEVEL2, {
if (somethingistrue)
printf("Debugging is TRUE");
else
foo();
});
如果定义了_DEBUG,则包含您的code
。如果没有,则不会编译任何内容。