谁能告诉我为什么不包括stdio.h
并仍在使用该printf
功能只会在 gcc 上发出警告?
警告:内置函数'printf'的隐式声明不兼容</p>
相反,这应该是一个编译错误,因为我们包含了一个未声明的函数。
这与链接过程有关吗?请详细说明。
当您不为代码中使用的函数提供签名时,编译器将(隐式)对未知函数作为参数列表接受的内容做出一些假设,并作为结果返回。
这些假设基于您对函数的使用,因此例如给定printf("%s", (char *) string)
,编译器将确定这printf
是一个函数,它恰好采用 2 char *
-不是变量参数列表 - 并返回一个int
.
当这些假设与实际功能不兼容时,可能会在链接期间出现问题。
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'
它很可能与您的编译器和默认库有关。如果您要链接到已经使用 printf 的标准库(可能是调试版本),那么 printf 将位于全局命名空间中并被链接。编译器警告你你没有明确声明 printf。您可以打开 -Werror 以使所有警告错误,然后编译器不会让它进入链接器阶段。