一尘不染

没有标题的C程序

linux

我用C语言编写“ hello world”程序

void main()
{ printf("Hello World"); }
// note that I haven't included any header file

程序编译时显示警告为

vikram@vikram-Studio-XPS-1645:~$ gcc hello.c 
hello.c: In function ‘main’:
hello.c:2:2: warning: incompatible implicit declaration of built-in function ‘printf’
vikram@vikram-Studio-XPS-1645:~$ ./a.out 
Hello Worldvikram@vikram-Studio-XPS-1645:~$

这怎么可能?OS如何在不包含任何标题的情况下链接库?


阅读 207

收藏
2020-06-07

共1个答案

一尘不染

编译器使用对称为的函数的引用来构建源文件printf()而无需
知道其实际使用的参数或其返回类型是什么。生成的程序集在程序的静态数据区域中包含push字符串地址的"Hello World",后跟callprintf

将您的目标文件链接到可执行文件时,链接器会看到对它的引用printf并提供C标准库函数printf()。通过 巧合 ,你传递的参数(const char*)是真正的声明兼容printf(),所以它能够正确工作。但是,请注意,printf()您的程序隐式声明的具有返回类型int(我认为),标准printf()也具有该类型。但是如果它们不同,并且您要将调用的结果分配给printf()变量,则可能会出现不确定的行为,并且可能会得到不正确的值。

长话短说:#include正确的标头可为您使用的函数获得正确的声明,因为不建议使用这种隐式声明,因为它容易出错。

2020-06-07