C语言预处理器语句的缩进

5

我正在使用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

那么,有什么我可以做的让上面的缩进被视为默认值吗?

预处理器指令不会在程序结构中执行,因此您不应缩进这样的条件编译代码(与条件代码不同!)。也不应缩进指令本身。请从第1列开始。 - too honest for this site
注意:#else #ifdef X 翻译为 #elif defined(X) - Eugene Sh.
是的,要自己缩进代码。没有必要依赖编辑器,而且在我看来,这是一种懒惰的坏习惯。你不需要花太多时间缩进代码。 - Iharob Al Asimi
坏习惯是使用预处理器,不习惯自动缩进。如果您将test定义为static const bool并使用普通的if语句,则自动缩进将正常工作,并且编译器将优化检查。那么有什么不喜欢的呢? - rici
@rici 我提出这个问题是因为我在解决一个练习的一部分时,明确要求使用预处理器语句。如果我自己随意编写程序,我肯定会避免使用它们。 - Ch0sen
显示剩余4条评论
1个回答

5
简短回答是:编辑器上的自动缩进遵循已有的语言指南,而您试图做的事情并不被认为是“良好实践”,因此在任何编辑器中都没有实现(至少我没有看到过)。
更长的答案是:C语言没有任何缩进规则,因此任何缩进都是通过已有的惯例完成的。不同的人对他们所理解的惯例的理解有不同的意见。具体来说,对于预处理器条件,我从未见过有人使用任何额外的深度 - 在我看来,这将是一种不好的做法,因为当与语言条件混合使用时,会变得非常混乱(即如果(代码))。请看这两个基本示例:
    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章涉及条件编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接