C中有多少种写作功能?

时间:2012-03-11 12:45:35

标签: c function

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

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

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

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

4 个答案:

答案 0 :(得分:11)

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

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

你的“2 nd 风格”被称为 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)正在接受-std=c11 IIRC的新标准 C11

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

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

答案 1 :(得分:2)

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

  1. 如果函数原型也缺失,编译器将不会检查正确的参数类型。而且,如果我没记错的话,也不会检查参数数量
  2. 此(K& R,1st Ed)样式仅对后向兼容性有效...有一天, C标准(可能)不允许这种风格,您的程序将停止。
  3. 另外,为了更好的可读性,您可以将函数的返回类型放在自己的行中(对于unsigned long int和标题等冗长的返回类型尤其有用:

    int 
    foo(int a) 
    {
        return a;
    }
    

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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