当没有包含正确的头文件时,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/