【发布时间】:2021-12-29 19:19:09
【问题描述】:
在隐式声明函数的情况下,gcc 有时会告诉你函数所属的头文件。从this answer 看来,似乎只有一些函数是内置的——“一些编译器包含对它们的内置声明,因此它们可以进行一些基本的类型检查”。
这就是 gcc 能够告诉你哪个头文件对应于一些隐式声明的函数而不是其他的吗?
例如,
-
隐式使用 printf 会产生额外的注释:
- compilation.c:4:5: 注意:包括头文件
或明确提供 'printf' 的声明
- compilation.c:4:5: 注意:包括头文件
-
但来自 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