gpt4 book ai didi

K&R 中的 C 函数声明

转载 作者:太空狗 更新时间:2023-10-29 16:42:34 28 4
gpt4 key购买 nike

我不熟悉 K&R 风格的函数声明。

以下编译,有警告(仅与 -Wall 的 main 的返回值有关)但是使用的变量的数据类型是什么?

main(a, b, c, d){
printf("%d", d);
}

foo(a, b){
a = 2;
b = 'z';
}

如果这是之前的问题,请在评论部分提供链接。我找不到类似的东西。

编辑

我刚刚遇到一个混淆的 C 代码,它使用了这些。
但我可以向你保证,我不会在 C 编程中使用这种语法。

最佳答案

“K&R C”指的是 1978 年 Kernighan 和 Ritchie 的著作《The C Programming Language》第一版所定义的语言。

在 K&R(即 ANSI 之前的版本)C 中,实体通常可以在没有显式类型的情况下声明,并且默认类型为 int。这可以追溯到 C 的祖先语言 B 和 BCPL。

main(a,b,c,d){
printf("%d", d);
}

几乎等同于:

int main(int a, int b, int c, int d) {
printf("%d", d);
}

旧语法在 ANSI C (1989) 和 ISO C (1990) 中仍然合法但已过时,但 1999 ISO C 标准放弃了“隐式 int”规则(同时保留旧式声明和定义语法)。

请注意,我说的是几乎 等效。从定义上看,它本质上是一样的,但作为声明,它不提供参数类型信息。使用旧式定义,不需要诊断参数数量或类型错误的调用;这只是未定义的行为。对于可见的原型(prototype),不匹配的参数会触发编译时诊断——并且在可能的情况下,参数会隐式转换为参数类型。

因为这是 main 的定义,所以还有另一个问题。该标准只为 main 指定了两种形式(一种没有参数,一种有两个参数,argcargv)。一个实现可能支持其他形式,但具有四个 int 参数的实现不太可能是其中之一。因此,程序的行为是未定义的。实际上,d 在初始调用时很可能会有一些垃圾值。 (是的,在 C 中允许递归调用 main,但这绝不是一个好主意。)

foo(a,b){
a = 2;
b = 'z';
}

这几乎等同于:

int foo(int a, int b) {
a = 2;
b = 'z';
}

(注意 'z'int 类型,而不是 char 类型。)

再一次,旧的形式不给你参数类型检查,所以这样的调用:

foo("wrong type and number of arguments", 1.5, &foo);

无需诊断。

底线:了解 K&R 风格函数声明和定义的工作原理是件好事。仍然有使用它们的旧代码,即使在 C2011 中它们仍然合法(但已过时)(尽管没有“隐式 int”规则)。但是几乎没有充分的理由编写使用它们的代码(除非你被困在一个非常老的编译器上,但这种情况很少见,而且越来越少。)

But I can assure you, I won't be using such syntax in C programming.

太棒了!

关于K&R 中的 C 函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18421735/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com