【问题标题】:How does GCC compiler find the header file corresponding to some implicitly declared functions?GCC编译器如何找到一些隐式声明的函数对应的头文件?
【发布时间】:2021-12-29 19:19:09
【问题描述】:

在隐式声明函数的情况下,gcc 有时会告诉你函数所属的头文件。从this answer 看来,似乎只有一些函数是内置的——“一些编译器包含对它们的内置声明,因此它们可以进行一些基本的类型检查”。

这就是 gcc 能够告诉你哪个头文件对应于一些隐式声明的函数而不是其他的吗?

例如,

  • 隐式使用 printf 会产生额外的注释:

    • compilation.c:4:5: 注意:包括头文件 或明确提供 'printf' 的声明
  • 但来自 stdlib 的 bsearch 没有:

    • compilation.c:5:5: 错误:函数“bsearch”的隐式声明在 C99 中无效 [-Werror|,-Wimplicit-function-declaration]

【问题讨论】:

  • 我猜这取决于您使用的 C 标准。
  • 嗯,不同的标准可能定义了不同的“内置”函数,但是对于给定的标准,编译器如何找到与隐式声明的“内置”函数关联的头文件呢?跨度>
  • printf 是一个常见的错误来源,它可能会被试图对人类友好的编译器部分进行特殊处理。除此之外,它也是一个 intrinsic(builtin function),因此 gcc 对它的了解比您假设的“正常”声明要多得多。
  • 编译器、头文件和库作为一个包提供。您可以添加额外的头文件和库,但 C 标准禁止更改或替换编译器附带的头文件或库。所以编译器知道printf 在stdio.h 中,因为一些开发人员编写了代码来建立这种连接。
  • 感谢您的回复和澄清。 @EricPostpischil 很好,我搞砸了复制粘贴 :) 修复了它

标签: c compilation


【解决方案1】:

gcc 如何能够告诉您哪个头文件对应于一些隐式声明的函数而不是其他函数?

Gcc 有一个符号和标题列表。当遇到符号但未定义且在列表中时,将显示一条带有建议标题名称的消息。

请参阅来自 gcc 来源的https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/gcc/c-family/known-headers.cc#L157 列表。

bsearch 不在列表中,因此不显示提示。我喜欢这些提示,如果能包含 C 标准中的所有符号,包括bsearch,那就太好了。如果列表将被排序并使用bsearch,这也将是一个加速。您可以contribute to gcc 或donate to gcc 并将其写到 gcc 邮件列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多