printf仅提供警告

aka*_*ash 4 c printf warnings stdio

任何人都可以告诉我为什么包括stdio.h仍然使用该printf功能只在gcc上发出警告?

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

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

这与链接程序有关吗?请详细说明.

pb2*_*b2q 8

如果不为代码中使用的函数提供签名,编译器将(隐式)对未知函数作为参数列表接受的内容做出一些假设,并返回结果.

这些假设是基于你对函数的使用,所以例如给定printf("%s", (char *) string),编译器将决定这printf是一个正好取2的函数char *- 而不是变量参数列表 - 并返回一个int.

链接期间出现问题时,这些假设会变得与实际功能不相容.


jxh*_*jxh 6

pb2q的答案是对的.此答案提供了有关您提出的特定警告消息的一些其他说明.

GCC定义了一个内置函数printf.内置函数有适当的原型:

int printf(const char *, ...);
Run Code Online (Sandbox Code Playgroud)

但是,隐式声明假定固定数字参数.所以,假设你的程序看起来像:

int main () {
    printf("%s\n", "Hello, World!");
    return 0; // not required in C 2011
}
Run Code Online (Sandbox Code Playgroud)

然后隐含的声明printf将是:

int printf(char *, char *);
Run Code Online (Sandbox Code Playgroud)

这与内置函数的类型不匹配,因此警告的措辞.你可能会在那条抱怨缺乏原型的消息之前收到一条警告信息.

warning: implicit declaration of function 'printf'
Run Code Online (Sandbox Code Playgroud)