【问题标题】:Indentation of preprocessor statements in CC 中预处理器语句的缩进
【发布时间】:2016-04-09 13:32:32
【问题描述】:

我正在用 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 列开始。
  • 注意:#else #ifdef X 正在翻译为#elif defined(X)
  • 是的,你自己缩进你的代码。没有必要为此依赖编辑,恕我直言,这是一个让人懒惰的坏习惯。您不会花太多时间缩进代码。
  • @iharob 我确实是一个初学者程序员,但我想知道:为什么习惯自动缩进是一个坏习惯?我的意思是,这难道不是人们使用文本编辑器的原因之一吗?
  • 你可以使用自动缩进就好了,不要习惯编辑器为你缩进代码。不是每个人都喜欢预处理器宏缩进,所以这可能是你的 vim 行为如此的原因。您可以尝试在代码格式方面使用更复杂的编辑器,vim 但是由于编辑机制,它非常适合编辑代码。

标签: c vim indentation c-preprocessor code-formatting


【解决方案1】:

简短的回答是:编辑器的自动缩进遵循既定的语言准则,而您尝试做的事情不被视为“良好做法”,因此尚未在任何编辑器中实施(至少我见过) .

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

    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 章处理条件编译。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多