C中预处理器语句的缩进
Indentation of preprocessor statements in C
我正在用 C 编写一个程序,它应该根据符号常量的定义与否采取不同的行为。举个简单的例子,我的第一个想法是这样写:
#include <stdio.h>
#define TEST
int main(void) {
int num;
#ifdef TEST
num=1;
printf("YES\n");
#else
num=0;
printf("NO\n");
#endif
printf("%d\n", num);
return 0;
}
但是,在尝试自动缩进我的代码时(特别是通过在 vim 中使用 gg=G
),我的缩进丢失了:
#include <stdio.h>
#define TEST
int main(void) {
int num;
#ifdef TEST
num=1;
printf("YES\n");
#else
num=0;
printf("NO\n");
#endif
printf("%d\n", num);
return 0;
}
当然,如果我尝试像下面这样自动缩进(中间有实际命令),就会出现混乱:
#ifdef TEST1
commands
#ifdef TEST2
commands
#else
#ifdef TEST3
commands
#endif
commands
#endif
#endif
那么,我能做些什么来将上面的缩进视为默认缩进吗?
简短的回答是:auto-indentation 编辑器遵循既定的语言准则,您尝试做的事情不被考虑 'good practice' 因此尚未在任何编辑器中实现(我'至少见过)。
更长的答案:C语言没有任何缩进规则,所以任何缩进都是按照惯例进行的。不同的人对他们理想的既定做法有不同的看法。专门针对预处理器条件,我从未见过有人使用任何额外的深度 - 和 IMO 这将是不好的做法,因为当与语言条件混合时它会变得非常混乱(即 if(代码))
看看这两个基本示例:
if (conditional1)
action1();
#if compileoption1
else if (conditional2)
action2();
#else
action3();
#endif
和
#if compileoption1
if (conditional1)
#endif
action1();
通过缩进来遵循逻辑变得完全不可能。 pre-processor 和实际编译器是独立的步骤,pre-processor 步骤不关注实际的 C 语义,因此条件语句可以在与 C 流控制语句完全正交的地方开始和结束(if、while、 for, etc...), 使得很难尝试通过缩进之类的东西来统一它们。在我看来,这就是为什么不对预处理器条件使用缩进已成为标准做法的原因。
对于一些完善的约定,请参阅内核编码指南:
https://www.kernel.org/doc/Documentation/CodingStyle
第 20 章介绍条件编译。
我正在用 C 编写一个程序,它应该根据符号常量的定义与否采取不同的行为。举个简单的例子,我的第一个想法是这样写:
#include <stdio.h>
#define TEST
int main(void) {
int num;
#ifdef TEST
num=1;
printf("YES\n");
#else
num=0;
printf("NO\n");
#endif
printf("%d\n", num);
return 0;
}
但是,在尝试自动缩进我的代码时(特别是通过在 vim 中使用 gg=G
),我的缩进丢失了:
#include <stdio.h>
#define TEST
int main(void) {
int num;
#ifdef TEST
num=1;
printf("YES\n");
#else
num=0;
printf("NO\n");
#endif
printf("%d\n", num);
return 0;
}
当然,如果我尝试像下面这样自动缩进(中间有实际命令),就会出现混乱:
#ifdef TEST1
commands
#ifdef TEST2
commands
#else
#ifdef TEST3
commands
#endif
commands
#endif
#endif
那么,我能做些什么来将上面的缩进视为默认缩进吗?
简短的回答是:auto-indentation 编辑器遵循既定的语言准则,您尝试做的事情不被考虑 'good practice' 因此尚未在任何编辑器中实现(我'至少见过)。
更长的答案:C语言没有任何缩进规则,所以任何缩进都是按照惯例进行的。不同的人对他们理想的既定做法有不同的看法。专门针对预处理器条件,我从未见过有人使用任何额外的深度 - 和 IMO 这将是不好的做法,因为当与语言条件混合时它会变得非常混乱(即 if(代码)) 看看这两个基本示例:
if (conditional1)
action1();
#if compileoption1
else if (conditional2)
action2();
#else
action3();
#endif
和
#if compileoption1
if (conditional1)
#endif
action1();
通过缩进来遵循逻辑变得完全不可能。 pre-processor 和实际编译器是独立的步骤,pre-processor 步骤不关注实际的 C 语义,因此条件语句可以在与 C 流控制语句完全正交的地方开始和结束(if、while、 for, etc...), 使得很难尝试通过缩进之类的东西来统一它们。在我看来,这就是为什么不对预处理器条件使用缩进已成为标准做法的原因。 对于一些完善的约定,请参阅内核编码指南: https://www.kernel.org/doc/Documentation/CodingStyle
第 20 章介绍条件编译。