c - 函数的隐式声明

标签 c gcc compiler-construction gcc-warning

当没有包含正确的头文件时,GCC 通常会产生此警告。此链接 --> www.network-theory.co.uk/docs/gccintro/gccintro_19.html表示因为函数声明是隐式的(而不是通过 header 显式声明),错误的参数类型实际上可能会传递给函数,从而产生不正确的结果。我不明白这一点。这是否意味着编译器生成的代码会将机器字长的东西压入堆栈供被调用者使用,并希望获得最好的结果?

感谢详细信息。

最佳答案

如果编译器没有关于应该如何传递参数的特定信息,例如当没有原型(prototype)时或对于传递的参数,其中原型(prototype)有省略号('...'),编译器会遵循某些传递参数的规则。这些规则基本上遵循准标准(或 K&R)C 中发生的内容——在使用原型(prototype)之前。转述自 C99 6.5.2.2/6“函数调用”:

* the integer promotions are applied
* if the argument has float type it's promoted to double

在应用这些默认参数提升后,参数被简单地复制到编译器通常复制参数的任何地方(通常是堆栈)。因此,结构参数将被复制到堆栈中。

如果实际的函数实现与编译器创建参数的方式不匹配,那么你会得到未定义的行为(如果可以表示值或指向 char 的指针和指向 void 的指针可以混合,则有符号/无符号不匹配除外/匹配)。

同样在 C90 中,如果函数被隐式声明(C99 不允许,尽管它允许没有原型(prototype)的函数),返回值默认为 int。再一次,实际函数返回其他东西,未定义的行为结果。

关于c - 函数的隐式声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488429/

相关文章:

c# - 当 C# 编译器是用 C# 编写的时,是否可以修改它?

c++ - 为什么 OpenSSL 会崩溃?

c - 从二进制文件读取并转换为 double ?

c - 来自 C 的 Linux SSH

c - Perlin 噪声函数 - 值超出范围

c++ - 通过重载 = 运算符从 std::string 创建 String 对象

c# - 为什么 C# 编译器不阻止属性引用自身?

c - GNU 内置函数有哪些?

c - gcc 预处理器输出中以哈希符号和数字(如 '# 1 "a.c"')开头的行的含义是什么?

c++ - 解释器始终可以使用源代码是什么意思?