C 中预处理器语句的缩进

Ch0*_*sen 5 c vim code-formatting indentation c-preprocessor

我正在用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;
}
Run Code Online (Sandbox Code Playgroud)

但是,在尝试自动缩进我的代码(特别是gg=G在 vim 中使用)时,我的缩进丢失了:

#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;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果我尝试自动缩进如下内容(中间有实际命令),就会出现混乱:

#ifdef TEST1
   commands
   #ifdef TEST2
      commands
   #else
      #ifdef TEST3
         commands
      #endif
      commands
   #endif
#endif
Run Code Online (Sandbox Code Playgroud)

那么,我可以做些什么来将上述缩进视为默认值?

csd*_*csd 5

简短的答案是:编辑器的自动缩进遵循既定的语言指南,并且您尝试做的事情不被认为是“良好实践”,因此尚未在任何编辑器中实现(至少我见过)。

更长的答案:C 语言没有任何缩进规则,因此任何缩进都是按照惯例进行的。不同的人对于他们既定实践的理想是什么有不同的看法。特别是对于预处理器条件,我从未见过有人使用任何额外的深度 - 在我看来,这将是一种不好的做法,因为当与语言条件(即 if(代码))混合时,它会变得非常混乱,看看这两个基本示例:

    if (conditional1)
        action1();
#if compileoption1
        else if (conditional2)
            action2();
#else
        action3();
#endif
Run Code Online (Sandbox Code Playgroud)

#if compileoption1
    if (conditional1)
#endif
    action1();
Run Code Online (Sandbox Code Playgroud)

通过缩进来遵循逻辑变得完全不可能。预处理器和实际编译器是独立的步骤,并且预处理器步骤不关注实际的 C 语义,因此条件可以在与 C 流控制语句(if、while、for 等)完全正交的位置开始和结束。 ..),因此很难通过缩进之类的方式来统一它们。在我看来,这就是为什么预处理器条件不使用缩进已成为标准做法的原因。对于一些完善的约定,请参阅内核编码指南: https://www.kernel.org/doc/Documentation/CodingStyle

第 20 章讨论条件编译。