C++ ---这些数学函数/常量不应该是未定义的吗?

ant*_*ane 3 c++ boost

我不希望以下代码打印出sin(pi/2)的值,而不包含额外的头:

#include <iostream>

int main()
{
    std::cout << sin(0.5*M_PI) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且,正如预期的那样,在编译时我得到一个错误读取‘sin’ was not declared in this scope和类似的错误使用M_PI.

但是,我很困惑的事实是,如果我包含看似任何 提升库标题,请仅举例lexical_cast.hpp,而不是运行

#include <iostream>
#include <boost/lexical_cast.hpp>

int main()
{
    std::cout << sin(0.5*M_PI) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后代码工作,它打印1.

为什么要包含这个不包含M_PIor的定义的boost头,sin()允许定义这个常量和函数?我不应该包含一个标题,就像math.h包括这些东西一样有效吗?

seh*_*ehe 6

是的,它应该这样工作.

你尝试过的boost头都有隐式依赖(pow(),modf(),fmod(),log()等).

这在C++编译模型中很常见.没什么可惊慌的.

指南:始终明确包含您直接依赖的标头.只有那些.

这可以防止库标头依赖关系树不同的平台上的可移植性问题,例如<algorithms>,<numeric>并且不会隐式包含在某些其他标准库标头中(例如MSVC)