Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开放源码项目中的C99混合声明和代码?_C_Scope_C99_Variable Declaration - Fatal编程技术网

开放源码项目中的C99混合声明和代码?

开放源码项目中的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;

为什么像or这样的开源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”,因此不喜欢它


我真的不喜欢混合声明,因为它们会降低代码的可读性并导致难以看到的bug。Justin,我非常不同意你的编辑。我讨厌看到一个可以应用于多种语言的标题(粗体大字体),并且不得不在屏幕上的其他地方寻找以低对比度、小字体书写的标签,以便知道我是否对这个问题有什么要说的。只有标签才能消除歧义的模糊标题是可用性的噩梦。在可用性方面,标签通常会添加信息,而不是取代信息。@Carl,@Eduardo我想你们都夸大了对方喜欢的样式可能导致的错误。函数作用域变量会导致代码腐烂,因为代码被删除,变量变得未使用,而如果不小心命名,块作用域可能会导致变量隐藏。这两个问题都被一组很好的编译器警告所捕获,但窄范围仍然优于此,因为它更容易发现愚蠢的数据使用模式。。。卡尔:我认为这是一个概括:有时,混合声明可以使代码更具可读性;经常出现的一个例子是:首先在函数体中检查函数参数的先决条件,因为,你知道,这是一个先决条件;添加另一个块(导致额外的缩进级别)似乎有点过头了,imo@Christoph,@Dan,当然规则总是有例外的。我真的是想在一篇文章中陈述一个相反的观点