当我一开始就没有包含任何头文件时,编译器如何知道 sleep 函数甚至 printf 函数的原型(prototype)?
此外,如果我指定 sleep(1,1,"xyz")
或任意数量的参数,编译器仍会编译它。
但奇怪的是 gcc 能够在链接时找到这个函数的定义,我不明白这怎么可能,因为实际的 sleep()
函数只接受一个参数,但是我们的程序提到了三个参数。
/********************************/
int main()
{
short int i;
for(i = 0; i<5; i++)
{
printf("%d",i);`print("code sample");`
sleep(1);
}
return 0;
}
最佳答案
由于缺少更具体的原型(prototype),编译器将假定该函数返回 int 并接受您提供的任意数量的参数。
根据 CPU 架构,参数可以在寄存器中传递(例如,MIPS 上的 a0 到 a3),或者像原始 x86 调用约定一样将它们压入堆栈。在任何一种情况下,传递额外的参数都是无害的。被调用函数不会使用传入的寄存器,也不会引用堆栈上的额外参数,但不会发生任何不良情况。
传递的参数越少问题越大。被调用的函数将使用恰好位于适当的寄存器或堆栈位置中的任何垃圾,并且可能会发生 hijinks。
关于c - 为什么即使我们不在 C 程序中包含 stdio.h 也不会出现编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68843/