开放源码项目中的C99混合声明和代码?
为什么像or这样的开源C项目中仍然没有使用 我非常喜欢混合声明和代码,因为它通过将变量的范围限制在尽可能小的范围内,使代码更具可读性,并防止难以看到的错误。这是谷歌推荐的开放源码项目中的C99混合声明和代码?,c,scope,c99,variable-declaration,C,Scope,C99,Variable Declaration,为什么像or这样的开源C项目中仍然没有使用 我非常喜欢混合声明和代码,因为它通过将变量的范围限制在尽可能小的范围内,使代码更具可读性,并防止难以看到的错误。这是谷歌推荐的 例如,对于C99混合声明和代码,Linux至少有GCC 3.2和GCC 3.1可能不需要,可能分离良好?在C++中,我也有这个特性。没有什么理由重写Linux内核来进行不提供性能增益的外观修改。 如果代码库正常工作,那么为什么要出于表面原因对其进行更改呢?您不需要混合声明和代码来限制范围。你可以做: { int c;
例如,对于C99混合声明和代码,Linux至少有GCC 3.2和GCC 3.1可能不需要,可能分离良好?在C++中,我也有这个特性。
没有什么理由重写Linux内核来进行不提供性能增益的外观修改。 如果代码库正常工作,那么为什么要出于表面原因对其进行更改呢?
您不需要混合声明和代码来限制范围。你可以做:{
int c;
c = 1;
{
int d = c + 1;
}
}
在C89中。至于为什么这些项目没有使用混合声明(假设这是真的),最有可能的情况是“如果没有损坏,就不要修复它。”没有理由像这样更改代码,C99仍然没有得到编译器的广泛支持。这主要是关于可移植性的。我不记得在内核代码的样式指南中有任何针对这一点的禁令。然而,它确实说函数应该尽可能小,并且只做一件事。这可以解释为什么很少混合声明和代码 在一个小函数中,在作用域的开始处声明变量就像是一种介绍,告诉您接下来会发生什么。在这种情况下,变量声明的移动非常有限,可能没有效果,或者可以说,通过将barker推到人群中来隐藏一些关于功能的信息。国王的到来是在他进入房间之前宣布的,这是有原因的 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
定义了两次。“那么?删除第二个声明。”你说。但这会使代码不对称,最终导致更多重构限制
当然,我自己混合声明和代码;没有理由对它教条(否则你的因果报应可能会超过你的教条:-)。但是你应该知道随之而来的问题是什么。没有好处。在函数的开头声明所有变量(类似于pascal)要清楚得多,在C89中,还可以在每个作用域的开头声明变量(例如内部循环)这是一个老生常谈的问题,但我想指出,惯性是大多数项目仍然使用ANSI C声明规则的原因 然而,还有许多其他的可能性,从有效到荒谬:
- 便携性。许多开源项目都假定迂腐的ANSIC是编写软件的最可移植的方式
- 年龄。其中许多项目早于C99规范,作者可能更喜欢一致的编码风格
- 无知。提交C99之前的程序员并不知道混合声明和代码的好处。(另一种解释是:开发人员充分意识到潜在的权衡,并认为混合声明和语句是不值得的。我非常不同意,但很少有两个程序员会在任何事情上达成一致。)
- 福德。程序员将混合声明和代码视为“C++ism”,因此不喜欢它