我不希望以下代码打印出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_PI
或sin()
定义的boost标头,是否允许定义此常量和函数?我不应该包含一个标题,例如包含这些内容的math.h
吗?
答案 0 :(得分:6)
是的,它应该这样工作。
你尝试的boost标题都有隐式依赖(pow(),modf(),fmod(),log()等)。
这在C ++编译模型中很常见。没什么可惊慌的。
指南:始终显式包含您直接依赖的标头。只有那些。
这可以防止库标题依赖关系树不同的平台上的可移植性问题,例如:某些其他标准库标头(例如MSVC)未隐式包含<algorithms>
和<numeric>