【发布时间】:2012-03-11 12:45:34
【问题描述】:
到目前为止,我知道两种风格:
/* 1st style */
int foo(int a) {
return a;
}
/* 2nd style */
int foo(a)
int a;
{
return a;
}
(我看到有人用第二种风格写代码。起初我很惊讶,但第二种风格有效(在我测试的 gcc 下)。这让我很好奇,我想问这个问题。)
【问题讨论】:
到目前为止,我知道两种风格:
/* 1st style */
int foo(int a) {
return a;
}
/* 2nd style */
int foo(a)
int a;
{
return a;
}
(我看到有人用第二种风格写代码。起初我很惊讶,但第二种风格有效(在我测试的 gcc 下)。这让我很好奇,我想问这个问题。)
【问题讨论】:
我不会称这些风格,而是语言变体(或方言)。
编码风格是一组可能不遵循的可选约定。例如,某些编码样式要求宏名称全部大写(但如果您不遵循该规则,您的代码将编译)。
您的“2nd 风格”称为Kernighan & Ritchie C。它是 1970 年代后期定义的旧 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.以当前的系统和实践(例如多核处理器)
【讨论】:
使用第二种风格有(至少)两个缺点:
此外,为了更好的可读性,您可以将函数的返回类型放在单独的一行(特别适用于像unsigned long int 和标题这样冗长的返回类型):
int
foo(int a)
{
return a;
}
【讨论】:
第二种样式是较旧的样式,支持向后兼容。我不知道我脑海中还有其他样式,但是您应该使用第一种(较新的)样式。当我开始使用 C (1994) 时,第二种(较旧的)风格已经被弃用了。
【讨论】:
第二个是 K&R C 风格的语法,但现在已经过时了。查看@Basile Starynkevitch 的答案。
【讨论】: