前段时间我发现了一个(相当古老的)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
}
是一种缩进预处理器代码标准化的方式,也就是说,无论我如何缩进它,它总是以相同的方式工作?
答案 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)
如果你在预处理之前有空格,我不认为编译器“关心” - 它应该是相同的......