【问题标题】:printf gives WARNING onlyprintf 只给出警告
【发布时间】:2012-08-10 00:24:20
【问题描述】:

谁能告诉我为什么包括stdio.h并且仍然使用printf函数只会在gcc上给出警告?

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

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

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

【问题讨论】:

  • 关键字:隐式声明
  • @chris 还有这样的关键字吗?以及编译器如何链接到这个声明?
  • 好的,抱歉,“请详细说明”部分让我想起了作业的常用措辞方式。
  • @akash,你没有给它签名,所以它会为你猜测。如果那个猜测是错误的(通常是这样),链接器会抱怨,因为现在它无法匹配它。它只是警告你它必须猜测。
  • @chris 这是否意味着编译器对 printf 做出了正确的猜测,因此它只给出警告并将其链接到提供的声明?

标签: c warnings printf stdio


【解决方案1】:

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

这些假设是基于您对函数的使用,例如给定printf("%s", (char *) string),编译器将确定printf 是一个函数,它恰好接受2 个char * - 不是 变量参数列表 - 并返回一个int

链接期间可能会出现问题,当这些假设与实际功能不兼容时。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2021-04-13
        • 2017-10-27
        相关资源
        最近更新 更多