我已经用 C 语言编程有一段时间了。在此期间,我了解到将预处理器指令之前的“#”字符放在第一列是一种常见的约定。
Example:
#include <stdio.h>
int main(void) {
#ifdef MACRO1
#ifdef MACRO2
puts("defined(MACRO1) && defined(MACRO2)");
#else
puts("defined(MACRO1)");
#endif
#else
puts("!defined(MACRO1)");
#endif
return 0;
}
当人们缩进预处理器指令时,他们通常会这样做:
#include <stdio.h>
int main(void) {
#ifdef MACRO1
# ifdef MACRO2
puts("defined(MACRO1) && defined(MACRO2)");
# else
puts("defined(MACRO1)");
# endif
#else
puts("!defined(MACRO1)");
#endif
return 0;
}
我认为我从未见过有人这样格式化它:
#include <stdio.h>
int main(void) {
#ifdef MACRO1
#ifdef MACRO2
puts("defined(MACRO1) && defined(MACRO2)");
#else
puts("defined(MACRO1)");
#endif
#else
puts("!defined(MACRO1)");
#endif
return 0;
}
我的问题是 C 语言标准是否要求#
- 字符应位于第一列。
那么上面的第三种选择合法吗?
如果以上所有情况都是合法的,那么我想知道这是否合法。
#include <stdio.h>
int main(void) {
#ifdef MACRO
puts("defined(MACRO)");
/* Now there are other characters before the `#` */ #endif
return 0;
}
这里是#endif
不再位于该行的“开始”,因为中间还有其他非空白字符。
最后一个例子看起来很奇怪的是Vim
文本编辑器不突出显示#endif
评论之后。
我给出的所有这些示例都使用编译时没有任何警告gcc
与-Wall -pedantic
标志已打开(包括最后一个之前有评论的标志)#endif
).
请注意,我只是对语法感到好奇。我总是把#
-当我编程时,第一列的字符与其他人一样。我永远不会写这样的东西++i; #endif
在严肃的项目中。