【问题标题】:How many styles of writing functions are there in C?C中有多少种编写函数的风格?
【发布时间】:2012-03-11 12:45:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c function


    【解决方案1】:

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

    编码风格是一组可能不遵循的可选约定。例如,某些编码样式要求宏名称全部大写(但如果您不遵循该规则,您的代码将编译)。

    您的“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.以当前的系统和实践(例如多核处理器)

    【讨论】:

    • 当你的评论仅仅基于那一行代码时,你会把它称为一种语言而不是使用 K&R C,这会让人们感到困惑。
    • +1,但是:老风格是70年代的,新风格是1989年定义的; MSVC 编译器仍然不遵循 C99。
    【解决方案2】:

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

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

    此外,为了更好的可读性,您可以将函数的返回类型放在单独的一行(特别适用于像unsigned long int 和标题这样冗长的返回类型):

    int 
    foo(int a) 
    {
        return a;
    }
    

    【讨论】:

    • 您还可以通过 perl 和 awk 脚本更轻松地自动提取文档。
    【解决方案3】:

    第二种样式是较旧的样式,支持向后兼容。我不知道我脑海中还有其他样式,但是您应该使用第一种(较新的)样式。当我开始使用 C (1994) 时,第二种(较旧的)风格已经被弃用了。

    【讨论】:

      【解决方案4】:

      第二个是 K&R C 风格的语法,但现在已经过时了。查看@Basile Starynkevitch 的答案。

      【讨论】:

      • 而且 iirc 这已经在我 1990 年的“The C Programming Language, Second Edition, ANSI C”版本中被弃用了。
      • 是的,它已经过时了,添加它。
      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多