有人可以告诉我为什么不包括stdio.h
,并且仍然使用printf
功能只会在gcc上发出警告吗?
警告:内置函数'printf'的不兼容隐式声明
相反,这应该是编译错误,因为我们包含了一个未声明的函数。
这是否与链接程序有关?请详细说明。
答案 0 :(得分:8)
当您不为代码中使用的函数提供签名时,编译器将(隐式)对未知函数作为参数列表接受的内容做出一些假设,并作为结果返回。
这些假设基于您对函数的使用,例如给定printf("%s", (char *) string)
,编译器将确定printf
是一个函数,它只需2 char *
- 而不是一个变量参数列表 - 并返回{{1} }。
在链接期间,当这些假设与实际功能不兼容时,可能会出现问题。
答案 1 :(得分:6)
pb2q的回答是正确的。这个答案提供了一些关于你提出的特定警告信息的补充说明。
GCC为printf
定义了内置函数。内置函数具有适当的原型:
int printf(const char *, ...);
但是,隐式声明假定固定数字参数。所以,假设你的程序看起来像:
int main () {
printf("%s\n", "Hello, World!");
return 0; // not required in C 2011
}
然后printf
的隐式声明将是:
int printf(char *, char *);
与内置函数的类型不匹配,因此警告的措辞。很可能你在那条抱怨缺乏原型的消息之前收到了一条警告信息。
warning: implicit declaration of function 'printf'
答案 2 :(得分:0)
它很可能与您的编译器和默认库有关。如果要链接已使用printf的标准库(可能是调试版本),则printf将位于全局命名空间中并进行链接。编译器警告您没有显式声明printf。你可以打开-Werror来发出所有警告错误,然后编译器就不会让它进入链接器阶段。