【问题标题】:C macro/#define indentation?C 宏/#define 缩进?
【发布时间】:2009-12-06 06:30:45
【问题描述】:

我很好奇为什么我看到几乎所有的 C 宏都是这样格式化的:

#ifndef FOO
#   define FOO
#endif

或者这个:

#ifndef FOO
#define FOO
#endif

但绝不是这样:

#ifndef FOO
    #define FOO
#endif

(此外,vim 的 = 运算符似乎只将前两个算为正确。)

这是由于编译器之间的可移植性问题,还是只是一种标准做法?

【问题讨论】:

    标签: c macros portability indentation


    【解决方案1】:

    我看过这三种方式都做到了,这似乎是风格问题,而不是语法问题

    虽然通常第二个示例是最常见的,但我已经看到第一个(或第三个)用于帮助区分多个级别的#ifdefs 的情况。有时,逻辑可能会变得嵌套很深,并且一目了然地理解它的唯一方法是使用缩进,就像在 { 和 } 之间缩进代码块的常见做法一样。

    【讨论】:

      【解决方案2】:

      IIRC,较旧的 C 预处理器要求 # 是该行的第一个字符(尽管我实际上从未遇到过有此要求的字符)。

      我从未见过像您的第一个示例那样的代码。我通常像您的第二个示例一样编写预处理器指令。我发现它在视觉上对实际代码的缩进干扰更少(不再是我用 C 编写的)。

      GNU C Preprocessor manual 说:

      预处理指令是 以“#”开头的程序。 前后允许有空格 '#'。

      【讨论】:

      • 还有一个额外的烦恼(就像问题中提到的 OP),编辑们通常对预处理器条件块应该如何缩进(或不缩进)有自己的想法。
      • 如果预处理器指令在第一列中没有 #,旧的 VAX C 编译器(大约 1986 年)会抛出错误。
      【解决方案3】:

      出于偏好,我使用第三种样式,除了包含保护,我使用第二种样式。

      我根本不喜欢第一种风格——我认为#define 是一个预处理器指令,尽管它当然不是,它是一个#,后跟预处理器指令define。但既然我是这么想的,把它们分开似乎是错误的。我希望提倡这种风格的人编写的文本编辑器会有一个块缩进/取消缩进,适用于以这种风格编写的代码。但我不想使用没有的文本编辑器遇到它。

      没有必要迎合古老的预处理器,其中 # 必须是行的第一个字符,除非您还可以在头脑中列出这些实现与标准 C 之间的所有其他差异,以避免其他你可能做但他们不支持的事情。当然,如果您真的在使用预标准编译器,那是公平的。

      【讨论】:

        【解决方案4】:

        预处理器指令是我们程序中包含的行,它们实际上不是程序语句,而是预处理器的指令。这些行之前总是有一个井号 (#)。在 '#' 之前和之后允许有空格。一旦找到换行符,预处理指令就被认为结束了。

        就 C/C++ 的标准而言,没有其他规则,所以它仍然是样式和可读性问题,我只以您发布的第二种方式看到/编写程序,尽管第三种似乎更具可读性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-27
          • 2020-09-26
          • 2010-10-20
          • 1970-01-01
          相关资源
          最近更新 更多