这个奇怪的函数定义是什么意思?

5

我在一篇博客文章中发现了这个C程序:

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

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

这篇文章没有解释它。有人能解释一下这个奇怪的函数定义是什么意思吗?


2
请不要在提问后更改代码/问题。这可能会让查看答案的人感到困惑,因为它与实际问题无关。 - Vishal R
@ruakh,你改变了我的整个代码。在你加入我问题中的代码之前,还有另一个代码。所以我还需要编辑一下这个代码。 - opu 웃
你不理解这段代码的哪一部分?请具体说明需要解释的内容。 - Raymond Chen
@vishram0709,Scotia:我的错。 - ruakh
5个回答

10

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

f(x)
int x;

等同于 ANSI C:

void f(int x)

K&R C 是由Brian Kernighan和Dennis Ritchie所著的第一版C语言程序设计一书中描述的C语言,因两位作者命名而得名。该书的第二版更新为使用ANSI C。


2
即使在C11中仍然是有效的,因此,尽管您正确地建议不要使用它,但说“不要使用它”可能被认为有点过于强烈。特别是因为glibc使用它 :-) - paxdiablo

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

这是一种旧的定义函数的方式。现在可以将其理解为

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

1

这段代码很糟糕。

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

1
此外,编译器可能会将f()默认为返回int类型,这将导致编译器抱怨未返回值。 - Asblarf

0

请更换您的C语言学习资源!

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

f(x)

int x;
{}

等同于

void f(int x)
{}

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

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


@RobertMutke 你曾经参与过一些严肃的工业产品开发吗?大多数嵌入式系统编译器并不支持C99,尽管它们已获得认证。 - vlad_tepesch
让我不同意你的观点。gcc、keil和iar都完全支持c99。 - Robert Mutke
@RobertMutke,gcc并不完全支持c99!在安全相关产品中很少使用gcc。我也没有说c99应该被忽略。我只是说“了解基础知识”并且要知道其中的差异。 - vlad_tepesch
@RobertMutke 请注意这个帖子:https://dev59.com/eXVC5IYBdhLWcg3w9F89 和这个链接 http://gcc.gnu.org/c99status.html - vlad_tepesch

-2

这是一种非常老式的编码方式。在ANSI中无法正常工作。 最好使用类似于以下内容的东西

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接