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

时间:2015-11-22 19:49:09

标签: c++ boost

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

#include <iostream>

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

    return 0;
}

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

但是,如果我包含看似任何 boost library标题,我会感到困惑,例如只需lexical_cast.hpp,而不是运行

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

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

    return 0;
}

然后代码工作并打印1

为什么要包含这个不包含M_PIsin()定义的boost标头,是否允许定义此常量和函数?我不应该包含一个标题,例如包含这些内容的math.h吗?

1 个答案:

答案 0 :(得分:6)

是的,它应该这样工作。

你尝试的boost标题都有隐式依赖(pow(),modf(),fmod(),log()等)。

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

  

指南:始终显式包含您直接依赖的标头。只有那些。

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