printf仅提供警告

时间:2012-08-13 18:16:10

标签: c warnings printf stdio

有人可以告诉我为什么包括stdio.h,并且仍然使用printf功能只会在gcc上发出警告吗?

  

警告:内置函数'printf'的不兼容隐式声明

相反,这应该是编译错误,因为我们包含了一个未声明的函数。

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

3 个答案:

答案 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来发出所有警告错误,然后编译器就不会让它进入链接器阶段。