C printf仅给出警告

C printf仅给出警告,c,warnings,printf,stdio,C,Warnings,Printf,Stdio,有人能告诉我为什么不包括stdio.h并且仍然使用printf功能只会在gcc上发出警告吗 警告:内置函数“printf”的隐式声明不兼容 这应该是一个编译错误,因为我们包含了一个未声明的函数 这与链接过程有关吗?请详细说明。当您不为代码中使用的函数提供签名时,编译器将(隐式地)对未知函数接受的参数列表进行一些假设,并作为结果返回 这些假设基于您对函数的使用情况,因此,例如,给定printf(“%s”,(char*)字符串),编译器将确定printf是一个函数,它只接受2char*-而不是一个变

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

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

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


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

当您不为代码中使用的函数提供签名时,编译器将(隐式地)对未知函数接受的参数列表进行一些假设,并作为结果返回

这些假设基于您对函数的使用情况,因此,例如,给定
printf(“%s”,(char*)字符串)
,编译器将确定
printf
是一个函数,它只接受2
char*
-而不是一个变量参数列表,并返回一个
int


当这些假设与实际函数不兼容时,链接过程中可能会出现问题。

这很可能与编译器和默认库有关。如果您是针对已经使用printf的标准库(可能是调试版本)进行链接,那么printf将位于全局命名空间中并被链接。编译器警告您尚未显式声明printf。您可以启用-Werror来生成所有警告错误,然后编译器不会让它进入链接器阶段。

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'

关键词:隐式declaration@chris还有这样的关键词吗?编译器是如何链接到此声明的?好的,对不起,“请详细说明”部分提醒了我赋值的常用措辞。@阿卡什,你没有给它签名,所以它可以帮你猜。如果猜测是错误的(通常是错误的),链接器会抱怨,因为现在它无法匹配。它只是警告您它必须猜测。@chris这是否意味着编译器对printf进行了正确的猜测,因此它只给出警告并将其链接到提供的声明?