【问题标题】:What does this weird function definition mean?这个奇怪的函数定义是什么意思?
【发布时间】:2014-04-28 10:22:01
【问题描述】:

我在a blog post遇到了这个C程序:

main()
{
    int n;
    n = 151;
    f(n);
}

f(x)
int x;
{
    printf("%d.\n", x);
}

帖子没有解释。谁能解释一下这个奇怪的函数定义是什么意思?

【问题讨论】:

  • 一旦您提出要求,请不要更改代码/问题。这可能会误导那些查看答案并发现它不相关的人。
  • @ruakh,你改变了我的整个代码。在您包含在我的问题中的代码之前还有另一个代码。所以我得再编辑一下。
  • 这段代码的哪一部分你不明白?请具体说明您需要解释的内容。
  • @vishram0709,斯科舍省:过失。

标签: c function


【解决方案1】:
f(x)
int x;
{
    printf("%d.\n", x);
}

是定义函数的旧方法。现在可以读作

void f(int x)
{
    printf("%d.\n", x);
}

【讨论】:

    【解决方案2】:

    这是 C 代码的 K&R 风格,它仍然是有效的 C 语法,但我建议你不要在新编写的代码中使用它。

    f(x)
    int x;
    

    相当于ANSI C:

    void f(int x)
    

    K&R C 是在 Brian Kernighan 和 Dennis Ritchie 的书C programming language 的第一版中描述的 C 语言,并以两位作者的名字命名。本书的第二版更新为使用 ANSI C。

    【讨论】:

    • 即使在 C11 中它仍然 有效, 所以,虽然你在 suggesting 中是正确的,但它不应该被使用,说“不要使用它”可能被认为有点太强了。特别是因为 glibc 使用它:-)
    【解决方案3】:

    这段代码很糟糕。

    1. 过时的函数声明f()
    2. main()之前应该有f()的前向声明
    3. f() 缺少返回类型

    【讨论】:

    • 另外,编译器可能会将f()默认为int作为返回类型,这反过来会导致编译器抱怨没有返回值。
    【解决方案4】:

    请更改您的 c 学习源!

    这是一种非常古老的 C (K&R C) 风格。

    f(x)
    
    int x;
    {}
    

    等价于

    void f(int x)
    {}
    

    你真的不应该浪费时间去学习。

    寻找教授 ANSI C C89/C90 的资源,并注意 C99 的新特性(许多编译器并未广泛采用,因此了解其中的差异)

    【讨论】:

    • @RobertMutke 你有没有做过一些 serios 工业产品?大多数经过认证的嵌入式系统编译器实际上并不支持 c99。
    • 让我不同意你的观点。 gcc、keil、iar全面支持c99
    • @RobertMutke gcc 不完全支持 c99!你很少会在安全相关产品中使用 gcc。我也不难过c99应该被忽略。我只是难过'知道基础'并知道差异。
    • @RobertMutke 也看看这个帖子:stackoverflow.com/questions/139479/… 和这个链接gcc.gnu.org/c99status.html
    【解决方案5】:

    这是一种非常古老的编码风格。这在 ANSI 中行不通。 最好使用类似的东西

    void f(int x)
    {
     ... ... ...;/*Whatever is required*/
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多