这种奇怪的C代码格式是什么?

时间:2008-09-16 09:55:21

标签: c formatting

如下所示,通过格式化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);

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

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

我注意到vim格式化必须手工处理以处理大写。

10 个答案:

答案 0 :(得分:25)

最好的例子是“Whitesmiths style”。 Wikipedia's entry on Indent Styles解释了几种风格及其优缺点。

答案 1 :(得分:9)

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

答案 2 :(得分:8)

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

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 :(得分:5)

这看起来很标准。我所做的唯一个人改变是将大括号与前一行的开头对齐,而不是下一行的开头,但这只是个人选择。

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

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

好的,在那个例子中很容易看出发生了什么,但是如果你在if语句中加入了很多代码,有时很难说没有一致的缩进就知道你在哪里。

在你的例子中,看一下exit(1)语句的位置 - 如果它没有像那样缩进,那么就很难分辨出这是什么。事实上,你可以在那个大的if语句的末尾告诉它。

答案 4 :(得分:4)

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

答案 5 :(得分:3)

代码格式化是个人品味。只要它易于阅读,就可以为维护付出代价!

答案 6 :(得分:2)

通过遵循一些格式和评论标准,首先您向其他人表达您的尊重,这些人将阅读和编辑您编写的代码。如果您不接受规则并以某种方式编写深奥的代码,最可能的结果是您将无法有效地与其他人(程序员)进行通信。代码格式是个人选择,如果软件只由您和您编写而且没有人希望阅读它,但有多少现代软件只由一个人编写?

答案 7 :(得分:1)

它只是另一种风格 - 人们编码他们喜欢编码的方式,这是一种被接受的风格(虽然不是我的首选)。我认为它没有太多的缺点或优势,而不是更常见的方式,其中括号没有缩进,但其中的代码是。也许人们可以通过说它更明确地划分代码块来证明它是正确的。

答案 8 :(得分:1)

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

在我工作的地方,这个缩进方案用于促进本土折叠编辑器机制。

因此,我认为这种格式没有根本错误 - 在某些合理的限度内,格式化是个人偏好的问题。

答案 9 :(得分:1)

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

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

因此,如果发生的错误/其他错误,循环出错,并以错误的级别捕获以及总体逻辑一致性,则更少。

但是正如受益人写道:在一定的理性范围内,格式化是个人喜好的问题。