1

如下格式化 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 格式必须手动处理才能处理顶部情况。

4

10 回答 10

27

最典型的例子被称为“Whitesmiths style”。Wikipedia 关于缩进样式的条目解释了几种样式及其优缺点。

于 2008-11-07T09:35:09.827 回答
9

您看到的压痕是Whitesmiths 样式它在Code Complete的第一版中被描述为“begin-end Block Boundaries”。这种风格的基本论点是,在像 C(和 Pascal)这样的语言中,anif控制单个语句或块。因此,整个块,而不仅仅是它的内容,应该if通过一致的缩进来显示从属于 - 语句。

XXXXXXXXXXXXXXX       if (test)
   XXXXXXXXXXXX           one_thing();

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

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

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

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

IF test THEN
   oneThing;
   anotherThing
END
于 2008-11-07T17:05:52.587 回答
8

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

于 2008-09-16T09:57:04.237 回答
5

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

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

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

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

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

于 2008-09-16T10:10:33.843 回答
4

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

于 2008-09-16T09:57:24.000 回答
3

代码格式是个人喜好。只要它易于阅读,它就会支付维护费用!

于 2008-09-16T09:58:27.867 回答
3

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

于 2008-09-16T10:03:55.547 回答
1

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

于 2008-09-16T09:57:48.930 回答
1

为了让这种格式具有“优势”,我们确实需要一些等效的另一种格式的 C 代码来进行比较!

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

因此,我认为这种格式没有根本性的错误——在一定的合理范围内,格式是个人喜好的问题。

于 2008-09-16T09:58:55.823 回答
1

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

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

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

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

于 2019-10-18T19:06:26.510 回答