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

那么,我有什么办法可以将上面的缩进视为默认值吗?

最佳答案 简短的回答是:编辑器上的自动缩进遵循既定的语言准则,而您尝试做的事情并不被视为“良好实践”,因此未在任何编辑器中实现(至少我已经看过).

更长的答案:C语言没有任何缩进规则,因此任何缩进都是通过惯例进行的.不同的人对他们的既定实践理想有不同的看法.特别是对于预处理器条件,我从来没有见过任何人使用任何额外的深度 – 和IMO这将是不好的做法,因为当与语言条件混合时会变得非常混乱(即如果(代码))
看看这两个基本的例子:

    if (conditional1)
        action1();
#if compileoption1
        else if (conditional2)
            action2();
#else
        action3();
#endif

#if compileoption1
    if (conditional1)
#endif
    action1();

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

第20章涉及条件编译.

点赞