【发布时间】:2015-04-05 05:41:35
【问题描述】:
以下程序编译正确:
#include <algorithm>
int main(int argc, char *argv[]) {
return int(log(23.f));
}
(在 g++ 4.9.2 下,带有标志 -std=c++11)
代码使用函数log,该函数在<cmath> 上定义。但是,它不包括标头<cmath>,仅包括标头<algorithm>。为什么g++ 没有给出任何警告,并且编译正确?
【问题讨论】:
-
任何 C++ 标头都可以包含任何其他标头,但并非必须如此。在您的系统上,
<algorithm>似乎需要<cmath>。这很好,但不要依赖它。其他系统可能不会这样做,并且您的代码不会在其他系统上编译。并且那些其他系统上的编译器完全正确,不编译你的编译器同样正确的编译。 IWYU:包括您使用的内容。 -
顺便说一句
cmath定义std::log。log可能来自cmath实现,包括math.h。 -
... 或其他内容,包括
<math.h>,即使没有引入<cmath>。我不确定这是否符合要求,但这是现状。在全局命名空间中定义标准 C 库名称,后果自负。 -
@Potatoswatter
包括 (根据 [res.on.headers]/3)。 -
@fonini,只是为了添加一些细节,在 C++11 模式下,GCC 的
<algorithm>包含<random>,因为std::shuffle()使用std::uniform_int_distribution,而<random>包含许多标题,包括<cmath>.
标签: c++ c++11 standards c++-standard-library