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

时间:2010-08-20 15:21:10

标签: c++ c-preprocessor

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

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

#define foo #ifdef foo #define bar #endif

这种线的语义是什么?

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

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

3 个答案:

答案 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。如果没有,则不会编译任何内容。