2012-08-13 73 views
3

有谁能告诉我为什么不是包括stdio.h而仍然使用printf函数只给gcc一个警告?printf只给出警告

警告:内建函数“printf的”不兼容的隐式声明

而这应该是一个编译错误,因为我们包括未声明的函数。

这是否与链接过程有关?请详细说明。

+9

关键字:*隐式声明* – chris 2012-08-13 18:16:56

+1

@Levon它不是。 – akash 2012-08-13 18:18:57

+1

@chris还有这样的关键字吗?以及编译器如何链接到这个声明? – akash 2012-08-13 18:19:45

回答

8

如果您没有为您在代码中使用的函数提供签名,编译器将(隐式)对未知函数接受什么作为参数列表做出一些假设,并作为结果返回。

这些假设是基于您对该功能的使用,例如,给出printf("%s", (char *) string),编译器将决定printf是一个函数,它需要一个可变参数列表,并返回一个int,这个函数完全需要2个char * - 而不是

问题可能发生在链接期间,当这些假设变成与实际功能不兼容时。

0

它很可能与您的编译器和默认库有关。如果您正在使用已经使用printf的标准库(可能是调试版本),那么printf将位于全局名称空间中并进行链接。编译器警告你,你没有明确声明printf。您可以打开-Werror使所有警告错误,然后编译器不会让它进入链接器阶段。

5

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'