预处理器指令应该在一行的开头吗?

时间:2011-01-18 08:38:23

标签: c++ c c-preprocessor

前段时间我发现了一个(相当古老的)C编译器,它以这种方式扫描宏(伪代码):

 if line.startswith("#include") or line.startswith("#define"):
     ...

..哪一种问题对我来说应该放置宏,在一行的开头,就像这样:

void stuff()
{
#if defined(WIN32) || defined(_WIN32)
    ...
#else
#if defined(__GNUC__)
    ...
#else
    ...
#endif
#endif
}

或者更像是这样(因为我这样做,为了提高可读性):

void stuff()
{
    #if defined(WIN32) || defined(_WIN32)
    ...
    #else
    #   if defined(__GNUC__)
    ...
    #   else
    ...
    #   endif
    #endif
}

是一种缩进预处理器代码标准化的方式,也就是说,无论我如何缩进它,它总是以相同的方式工作?

5 个答案:

答案 0 :(得分:17)

一些旧的C编译器要求#define(例如)与左边距齐平:

#define FOO bar

其他C编译器仅要求#位于左边距,因此您可以:

#    define FOO bar

较新的C编译器倾向于在任何前导空格之后接受#

    #define FOO bar

如果您希望与此类较旧的编译器兼容,则至少应将#放在第一列中。如果兼容性无关紧要,那就取决于你。

我通常会尝试不在函数中嵌入#ifdef块,所以它们是否应该缩进的整个问题大部分都会消失。

答案 1 :(得分:14)

来自gcc C preprocessor documentation

  

预处理指令是行   您的程序以#'. Whitespace is allowed before and after the#'开头。

答案 2 :(得分:2)

不,它们不需要在行的开头,但它们只能在它们之前有空格(空格,制表符......)。

通常它们被放在行的开头,因为它们不受它们所涉及的范围的限制,因为它们在实际的C代码之前被预处理。

答案 3 :(得分:-1)

没关系。这样看,如果代码没有被设想,并且在1行中它仍然应该编译(只有代码,预处理器/包含在其他一些东西需要一个单独的行)。

编辑:似乎真的很老的编译器对此很挑剔。预处理器应该在一行,就像其他非代码一样,包括

答案 4 :(得分:-3)

如果你在预处理之前有空格,我不认为编译器“关心” - 它应该是相同的......