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

18 c c++ c-preprocessor

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

 if line.startswith("#include") or line.startswith("#define"):
     ...
Run Code Online (Sandbox Code Playgroud)

..哪一种问题对我来说应该放置宏的位置,在一行的开头,如下所示:

void stuff()
{
#if defined(WIN32) || defined(_WIN32)
    ...
#else
#if defined(__GNUC__)
    ...
#else
    ...
#endif
#endif
}
Run Code Online (Sandbox Code Playgroud)

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

void stuff()
{
    #if defined(WIN32) || defined(_WIN32)
    ...
    #else
    #   if defined(__GNUC__)
    ...
    #   else
    ...
    #   endif
    #endif
}
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ill 17

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

#define FOO bar
Run Code Online (Sandbox Code Playgroud)

其他C编译器只#需要在左边距,所以你可以:

#    define FOO bar
Run Code Online (Sandbox Code Playgroud)

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

    #define FOO bar
Run Code Online (Sandbox Code Playgroud)

如果你想要与这些较旧的编译器兼容,你至少应该把你#放在第一列.如果兼容性无关紧要,那么由您决定.

我通常会尝试不将#ifdef块嵌入到函数中,因此它们是否应该缩进的整个问题大部分都会消失.


dav*_*vka 14

来自gcc C预处理器文档:

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