c - 为什么即使我们不在 C 程序中包含 stdio.h 也不会出现编译时错误?

标签 c compiler-construction

当我一开始就没有包含任何头文件时,编译器如何知道 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/

相关文章:

c++ - MSVC 编译器从 if/else 语句反汇编代码

windows - erlang在windows上的开发环境

c - 是否可以仅使用指向结构的指针(无数据类型)来实现堆栈?

c - 关于文件 I/O(读/写消息字符串)的很多问题

c - 生成的符号名称具有额外的前导下划线

c - 使用#define 定义的数字的平方

c - 从 csv 文件读取数据到结构中,返回错误

compiler-construction - 如果内存是字节可寻址的,为什么我们有对齐填充?

c++ - 如何生成包含所有依赖项的静态库?

java - OCaml 到 Java 的翻译