C99在开源项目中混合了声明和代码?

时间:2010-06-11 22:14:15

标签: c scope c99 variable-declaration

为什么在C99 mixed declarations and codeLinux kernel等开源C项目中仍未使用GNOME

我非常喜欢混合声明和代码,因为它使代码更具可读性,并且通过将变量的范围限制在最窄的范围内来防止难以看到错误。这是Google for C++推荐的。

例如,Linux requires至少GCC 3.2和GCC 3.1 has support用于C99混合声明和代码

7 个答案:

答案 0 :(得分:3)

需要混合声明和代码来限制范围。你可以这样做:

{
  int c;
  c = 1;
  {
    int d = c + 1;
  }
}
在C89中

。至于为什么这些项目没有使用混合声明(假设这是真的),它很可能是“如果它没有破坏就不解决它。”

答案 1 :(得分:3)

这是一个老问题,但我要建议惯性是大多数这些项目仍使用ANSI C声明规则的原因。

然而,还有许多其他可能性,从有效到荒谬:

  • 可移植性。许多开源项目都假设迂腐的ANSI C是最便于编写软件的方式。

  • 年龄。其中许多项目早于C99规范,作者可能更喜欢一致的编码风格。

  • 无知。程序员提交早期C99并且不知道混合声明和代码的好处。 (替代解释:开发人员充分意识到潜在的权衡,并决定混合声明和陈述不值得付出努力。我非常不同意,但很少有两个程序员会就任何事情达成一致。)

  • FUD。程序员将混合声明和代码视为“C ++主义”并因此而不喜欢它。

答案 2 :(得分:1)

没有理由重写Linux内核以进行不会带来性能提升的外观修改。

如果代码库正在运行,那么为什么要出于美观的原因进行更改?

答案 3 :(得分:1)

我不记得在内核代码的样式指南中对此有任何阻止。但是,它确实说功能应该尽可能小,只做一件事。这可以解释为什么声明和代码的混合很少见。

在一个小函数中,在范围的开头声明变量就像一种 Introit ,告诉你一些事情即将发生的事情。在这种情况下,变量声明的移动是如此有限,以至于它可能没有任何效果,或者可以通过将巴克推入人群来隐藏有关功能的一些信息,可以这么说。有一个原因是在进入房间之前,国王的到来被宣布为

OTOH,一个必须混合变量和代码才能读取的函数可能太大了。这是一个标志(以及过于嵌套的块,内联注释和其他内容),函数的某些部分需要被抽象为单独的函数(并声明为static,因此优化器可以内联它们)。

在函数开头保留声明的另一个原因:如果需要重新排序代码中的语句执行,可以将变量移出其作用域而不会意识到它,因为变量的作用域在缩进中的代码中间不明显(除非您使用块来显示范围)。这很容易修复,所以这只是一个烦恼,但新代码经常会经历这种转变,烦恼可能是累积的。

另一个原因是:您可能想要声明一个变量来从函数中获取错误返回代码,如下所示:

void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }

完全合理的事情要做。但是:

void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
....
int ret = another_func_may_fail();
if (ret) { handle_other_fail(ret); }

哎呀! ret定义了两次。 “那么?删除第二个声明。”你说。但这会使代码不对称,最终会产生更多的重构限制。

当然,我自己混合声明和代码;没有理由对它采取教条(否则你的业力可能会超过你的教条:-)。但你应该知道伴随的问题是什么。

答案 4 :(得分:0)

也许不需要,也许分离是好的?我是用C ++做的,它也有这个功能。

答案 5 :(得分:0)

没有理由像这样更改代码,C99仍然没有得到编译器的广泛支持。主要是关于便携性。

答案 6 :(得分:0)

没有任何好处。声明函数开头的所有变量(pascal like)要清楚得多,在C89中你也可以在每个作用域的开头声明变量(在循环示例中),这既实用又简洁。