为什么GNOME不使用C99?

5
看了一下mutter源代码evince源代码,它们仍然使用在函数开头声明所有变量的C89风格,而不是在第一次使用它时(有限的范围很好)。为什么他们不使用C99?GNOME 3最近推出,mutter相当新,如果原因是与旧代码风格兼容,那么这可能是一个很好的机会进行切换。
这是否意味着贡献给GNOME的代码需要用C89编写?

1
相关:https://dev59.com/10zSa4cB1Zd3GeqPjhuK#2303506 - dmckee --- ex-moderator kitten
3个回答

4

这个决策可以和Glib和GTK+背后的决策联系起来:

  • 不使用C99注释或声明。

原因:我们期望GLib和GTK+能够在各种编译器上构建,而C99支持还没有普及。

来源:http://live.gnome.org/GTK+/BestPractices


8
他们奇怪地声称这一点,然后在各个地方包含了各种不可移植的假设和代码,没有进行适当的配置检查... - R.. GitHub STOP HELPING ICE

2

说到作用域,我想你仍然可以这样做:

if (condition)
{
  int temporary = expression();
  trigger_side_effect(temporary);
}

换言之,在C89中,每个实际的大括号包围的作用域都可以包含新的变量声明。许多人对此感到惊讶;从这个角度来看,函数的顶层作用域和其中包含的任何其他作用域之间没有区别。变量将在声明它们的作用域下降的所有作用域中可见。

请注意,我不知道GNOME样式指南是否支持这一点,但至少它受C89支持,并且是一种推荐的技术(由我提出),以尽可能地保持本地化。


这是一个非常好的习惯用语,但每个新程序员都会被咬一口,因为他们试图在块关闭后使用“temporary”,或者当“temporary”遮蔽了来自上层作用域的变量时,他们做同样的事情,以至于它看起来可以工作,但并不是他们所期望的方式。 - dmckee --- ex-moderator kitten

1
许多人认为在代码块的任何地方声明变量,而不是在开头声明,是一种不好的风格。这使得查找声明稍微麻烦一些,并且需要检查整个函数才能找到它们。此外,由于某种原因,在语句后面声明变量是C99的最后一个功能之一,因此很长一段时间内,这是一个主要的兼容性考虑因素。

我已经写了25年的C语言,并且一直在思考最好的变量声明方式。我采用的风格是,在for循环中使用它们,当它们主要或仅用于计算循环次数时,并且您不想引起注意时。否则,通常最好在顶部声明它们,这样它们很容易找到 - 通常是类型后面跟着该类型的所有变量,以保持清洁并不占用屏幕太多垂直空间。 - user1899861
我的一般规则是使用风格上的点缀来吸引注意力,将琐碎的事情放在后台。C语言最伟大的特点之一就是能够将函数返回值作为函数参数使用。这在C库中被广泛应用,并且效果很好。 - user1899861

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接