我用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如何在不包含任何标题的情况下链接库?
编译器使用对称为的函数的引用来构建源文件printf(), 而无需 知道其实际使用的参数或其返回类型是什么。生成的程序集在程序的静态数据区域中包含push字符串地址的"Hello World",后跟call到printf。
printf()
push
"Hello World"
call
printf
将您的目标文件链接到可执行文件时,链接器会看到对它的引用printf并提供C标准库函数printf()。通过 巧合 ,你传递的参数(const char*)是真正的声明兼容printf(),所以它能够正确工作。但是,请注意,printf()您的程序隐式声明的具有返回类型int(我认为),标准printf()也具有该类型。但是如果它们不同,并且您要将调用的结果分配给printf()变量,则可能会出现不确定的行为,并且可能会得到不正确的值。
const char*
int
长话短说:#include正确的标头可为您使用的函数获得正确的声明,因为不建议使用这种隐式声明,因为它容易出错。
#include