即使我们不在C程序中包含stdio.h,为什么我们不会得到编译时错误?

前端之家收集整理的这篇文章主要介绍了即使我们不在C程序中包含stdio.h,为什么我们不会得到编译时错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我首先没有包含任何头文件时,编译器如何知道sleep函数的原型甚至printf函数

此外,如果我指定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;
}

解决方法

缺少更具体的原型,编译器将假定函数返回int并获取您提供的任意数量的参数.

根据cpu体系结构,参数可以在寄存器中传递(例如,MIPS上的a0到a3),或者像在原始x86调用约定中一样将它们推送到堆栈中.在任何一种情况下,传递额外的参数都是无害的.被调用函数不会使用传入的寄存器,也不会引用堆栈上的额外参数,但没有什么不好的事情发生.

传递更少的参数更成问题.被调用函数将使用发生在适当的寄存器或堆栈位置的任何垃圾,并且可能随之发生hijinks.

原文链接:https://www.f2er.com/c/116807.html

猜你在找的C&C++相关文章