C中有多少种写作function?

到目前为止,我知道两种风格:

/* 1st style */ int foo(int a) { return a; } /* 2nd style */ int foo(a) int a; { return a; } 

(我看到有人在第二种风格中编写代码。我最初感到很惊讶,但第二种风格有效(在我测试的gcc下)。这让我很好奇,我想问这个问题。)

我不会称这些样式,而是语言变体(或方言)。

编码样式是一组可能不遵循的可选约定。 例如,某些编码样式请求宏名称都是大写字母(但如果不遵循该规则,则代码将编译)。

你的“ 第二种风格”叫做Kernighan&Ritchie C. 它是20世纪70年代后期定义的旧C(在Kernighan和Ritchie的C着名书籍的第一版中;后续版本符合后来的C标准)。 这是一种过时的语言。

目前的编制者通常遵循C99 ISO标准(1999年出版),该标准已被新的C11标准(2011年出版)所取代。

GCC编译器正在接受带有-std=c99程序参数的C99标准。 我强烈建议使用gcc -Wall -std=c99进行编译; 最近的GCC编译器(即4.6和4.7)正在接受新标准C11的 -std=c11 IIRC。

今天不要用旧的Kernighan和Ritchie C方言编码:它已经过时了,编译器越来越少支持了。 如果你谨慎,恕我直言C99是一个很好的标准。 并利用它的一些function(特别是在块内混合声明和语句的能力;将所有声明放在块的开头所需的旧C语言。)。

该标准已经取得了进展,特别是因为它增加了function,并且对于当前的系统和实践更加精确(例如,多核处理器)

使用第二种风格时有(至少)两个缺点:

  1. 如果函数原型也缺失,编译器将不会检查正确的参数类型 。 而且,如果我没记错的话,也不会检查参数数量
  2. 这个(K&R,1st Ed)风格仅对后向兼容性有效…有一天, C标准(可能)不允许这种风格 ,你的程序将停止。

另外,为了更好的可读性,你可以将函数的返回类型放在它自己的行上(特别适用于冗长的返回类型,如unsigned long int和headers):

 int foo(int a) { return a; } 

第二种样式是旧样式,并支持向后兼容性。 我不知道我头顶的任何其他风格,但你应该使用第一个(更新)风格。 当我开始使用C(1994)时,第二种(较旧的)风格已被弃用。

第二个是K&R C风格的语法,但它现在已经过时了。 结帐@Basile Starynkevitch的回答。