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

前段时间我发现了一个(相当古老的)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 } 

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

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

 #define FOO bar 

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

 # define FOO bar 

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

  #define FOO bar 

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

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

来自gcc C预处理器文档 :

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

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

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

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

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

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