为啥某些 LLVM 标准库标头包含其他标头但 GCC 不 [重复]

Posted

技术标签:

【中文标题】为啥某些 LLVM 标准库标头包含其他标头但 GCC 不 [重复]【英文标题】:Why do some LLVM standard library headers include other headers but GCC does not [duplicate]为什么某些 LLVM 标准库标头包含其他标头但 GCC 不 [重复] 【发布时间】:2021-02-06 08:13:49 【问题描述】:

在跨 GCC 和 Clang 编译项目时,我注意到像 fabs 这样的函数会导致 GCC 上的编译问题,因为我自己从未包含过 <cmath>。我是在 Clang 上开发的,所以我从来没有注意到这一点,因为我使用的是 llvm <cstdlib> 头文件 includes <cmath> itself,似乎没有用它做任何事情,而 GCC 版本则没有。

这有什么原因吗?除了尝试之外,我还能做些什么来确保我的代码能够跨多个标准库编译?

【问题讨论】:

如果我没记错的话,该标准允许 C++ 实现在另一个标准头中包含任何标准头。这有时可以使您的代码编译,即使它没有包含所有需要的标头。人们希望实现更加迂腐,以便它们可以帮助发现此类错误并确保更多的可移植性,但现实情况有所不同。 【参考方案1】:

对于您使用的每个函数,请查阅 C++ 参考以找出您应该包含哪个标头。

The reference for fabs 表示您必须包含<cmath>

【讨论】:

好的,谢谢。我知道这样做,但是检查一个大文件中的每个函数并与文档交叉引用它并不有趣。幸运的是,我被一位朋友链接到 github.com/include-what-you-use/include-what-you-use 以自动执行此操作

以上是关于为啥某些 LLVM 标准库标头包含其他标头但 GCC 不 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Google 样式指南规定系统标头位于项目标头之前?

C 标准库中的头文件可以包含另一个头文件吗?

Gmail 邮件缺少标头的问题

为啥我不需要在 gcc 4.6 中包含 STL 标头?

为啥 gcov 为 STL 标头创建代码覆盖率数据?

如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?