如果不为代码中使用的函数提供签名,编译器将(隐式)对未知函数作为参数列表接受的内容做出一些假设,并返回结果.
这些假设是基于你对函数的使用,所以例如给定printf("%s", (char *) string),编译器将决定这printf是一个正好取2的函数char *- 而不是变量参数列表 - 并返回一个int.
当链接期间出现问题时,这些假设会变得与实际功能不相容.
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)