有谁能告诉我为什么不是包括stdio.h
而仍然使用printf
函数只给gcc一个警告?printf只给出警告
警告:内建函数“printf的”不兼容的隐式声明
而这应该是一个编译错误,因为我们包括未声明的函数。
这是否与链接过程有关?请详细说明。
有谁能告诉我为什么不是包括stdio.h
而仍然使用printf
函数只给gcc一个警告?printf只给出警告
警告:内建函数“printf的”不兼容的隐式声明
而这应该是一个编译错误,因为我们包括未声明的函数。
这是否与链接过程有关?请详细说明。
如果您没有为您在代码中使用的函数提供签名,编译器将(隐式)对未知函数接受什么作为参数列表做出一些假设,并作为结果返回。
这些假设是基于您对该功能的使用,例如,给出printf("%s", (char *) string)
,编译器将决定printf
是一个函数,它需要一个可变参数列表,并返回一个int
,这个函数完全需要2个char *
- 而不是。
问题可能发生在链接期间,当这些假设变成与实际功能不兼容时。
它很可能与您的编译器和默认库有关。如果您正在使用已经使用printf的标准库(可能是调试版本),那么printf将位于全局名称空间中并进行链接。编译器警告你,你没有明确声明printf。您可以打开-Werror使所有警告错误,然后编译器不会让它进入链接器阶段。
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'
关键字:*隐式声明* – chris 2012-08-13 18:16:56
@Levon它不是。 – akash 2012-08-13 18:18:57
@chris还有这样的关键字吗?以及编译器如何链接到这个声明? – akash 2012-08-13 18:19:45