【问题标题】:What is this strange C code format?这种奇怪的 C 代码格式是什么?
【发布时间】:2010-09-09 09:49:03
【问题描述】:

如下格式化 C 代码有什么好处(如果有的话):

while(lock_file(lockdir)==0)
    {
    count++;
    if(count==20)
        {
        fprintf(stderr,"Can't lock dir %s\n",lockdir);
        exit(1);
        }
    sleep(3);
    }
if(rmdir(serverdir)!=0)
    {
    switch(errno)
        {
        case EEXIST:
            fprintf(stderr,"Server dir %s not empty\n",serverdir);
            break;
        default:
            fprintf(stderr,"Can't delete dir %s\n",serverdir);
        }
    exit(1);
    }
unlock_file(lockdir);

相对于更典型的东西,例如

while(lock_file(lockdir)==0) {
    count++;
    if(count==20) {
        fprintf(stderr,"Can't lock dir %s\n",lockdir);
        exit(1);
    }
    sleep(3);
}
if(rmdir(serverdir)!=0) {
    switch(errno) {
        case EEXIST:
            fprintf(stderr,"Server dir %s not empty\n",serverdir);
            break;
        default:
            fprintf(stderr,"Can't delete dir %s\n",serverdir);
    }
    exit(1);
}
unlock_file(lockdir);

我只是发现顶级版本难以阅读,并且对于长块之外的语句,特别是对于包含多个嵌套块的长块而言,缩进级别是正确的。

我能看到的唯一优势就是与众不同,在你编写的代码上留下你的指纹。

我注意到 vim 格式必须手动处理才能处理大写。

【问题讨论】:

    标签: c formatting


    【解决方案1】:

    Whitesmiths 风格的“优势”(在您的示例中称为顶部)是它反映了代码的实际逻辑结构:

    • 如果存在逻辑依赖则缩进
    • 将相应的括号放在同一列上,以便于查找
    • 上下文的打开和关闭(可能打开/关闭堆栈框架等)是可见的,而不是隐藏的

    因此,减少了 if/else 错误、循环出错和错误级别的捕获以及整体逻辑一致性。

    但正如 benefactual 所写:在一定的合理限度内,格式是个人喜好的问题。

    【讨论】:

      【解决方案2】:

      您看到的缩进是Whitesmiths style。在Code Complete 的第一版中将其描述为“开始-结束块边界”。这种风格的基本论点是,在像 C(和 Pascal)这样的语言中,if 控制单个语句或块。因此,整个块,而不仅仅是它的内容,应该通过一致的缩进显示从属于if-statement。

      XXXXXXXXXXXXXXX       if (test)
         XXXXXXXXXXXX           one_thing();
      
      XXXXXXXXXXXXXXX       if (test)
         X                     {
         XXXXX                 one_thing();
         XXXXX                 another_thing();
         X                     }
      

      当我第一次阅读这本书时(在 90 年代),我发现“开始-结束块边界”的论点是令人信服的,尽管当我将它付诸实践时(在 Pascal 中)我不太喜欢它。我更不喜欢 C 语言中的它,并且觉得它读起来很混乱。我最终使用了 Steve McConnel 所说的“模拟纯块”(Sun's Java Style,几乎是 K&R)。

      XXXXXXXXXXXXXX X      if (test) {
         XXXXXX                one_thing();
         XXXXXX                another_thing();
      X                     }
      

      这是最常见的 Java 编程风格(这是我整天都在做的事情)。它也与我的previous language 最相似,这是一种“纯块”语言,不需要“仿真”。没有单语句体,块是控制结构语法中固有的。

      IF test THEN
         oneThing;
         anotherThing
      END
      

      【讨论】:

        【解决方案3】:

        上面的例子被称为“Whitesmiths style”。 Wikipedia's entry on Indent Styles 解释了几种样式及其优缺点。

        【讨论】:

        • 我自己更喜欢 Allman 或 GNU,因为我总是很难用 function() { layout 阅读其他类型。
        • 我看到了 GNU 风格的价值,尤其是当你有很好的语法高亮显示它足够聪明来计算大括号时。它也很容易用 2x2 的压痕击中 80 列的“螺母”。但就我个人而言,我更喜欢 K&R,80 列的螺母告诉我什么时候需要重构。
        【解决方案4】:

        对我来说这看起来很标准。我要做的唯一个人更改是将花括号与上一行的开头对齐,而不是下一行的开头,但这只是个人选择。

        无论如何,您正在查看的格式样式是 C 和 C++ 的标准样式,使用它是因为它使代码更易于阅读,特别是通过查看缩进级别,您可以知道在哪里你有嵌套循环、条件等。例如:

        if (x == 0) 
        {
          if (y == 2)
          {
            if (z == 3)
            {
               do_something (x);
            }
          }
        }
        

        好吧,在那个例子中很容易看出发生了什么,但是如果你在这些 if 语句中放置了很多代码,如果没有一致的缩进,有时很难判断你在哪里。

        在您的示例中,请查看 exit(1) 语句的位置——如果它没有像那样缩进,就很难判断它在哪里。事实上,你可以看出它位于那个大 if 语句的末尾。

        【讨论】:

          【解决方案5】:

          通过遵循一些格式和注释标准,首先你要表达你对阅读和编辑你所写代码的其他人的尊重。如果您不接受规则并编写某种深奥的代码,最可能的结果是您将无法有效地与其他人(程序员)沟通。如果软件仅由您和为您编写,并且没有人会阅读它,那么代码格式是个人选择,但是有多少现代软件仅由一个人编写?

          【讨论】:

          • 我希望它是那么简单。问题在于竞争标准。一些,但不是全部,更喜欢前者(或者更确切地说,Ben 对前者的描述)。其他人更喜欢后者。双方都对此深信不疑。
          【解决方案6】:

          为了让这种格式有“优势”,我们真的需要一些其他格式的等效C代码来比较!

          在我工作的地方,使用这种缩进方案是为了促进本土的折叠编辑器机制。

          因此,我认为这种格式没有根本性的问题 - 在某些合理的限制内,格式是个人喜好问题。

          【讨论】:

            【解决方案7】:

            代码格式是个人喜好。只要易于阅读,就需要维护!

            【讨论】:

              【解决方案8】:

              这只是另一种风格——人们按照他们喜欢的方式编写代码,这是一种公认​​的风格(尽管不是我的首选)。我认为它与括号不缩进但其中的代码缩进的更常见样式相比没有太多缺点或优势。也许有人可以通过说它更清楚地划分代码块来证明这一点。

              【讨论】:

                【解决方案9】:

                个人偏好我会想到吗?我猜它的代码块在一条垂直线上,所以可能更容易一目了然?个人更喜欢大括号直接在上一行下面开始

                【讨论】:

                  【解决方案10】:

                  什么都没有。缩进和其他编码标准是一个偏好问题。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-06-12
                    相关资源
                    最近更新 更多