如何指定使用math.h中的cos函数而非cmath?
如何明确指定使用math.h中的cos函数
math.h是C标准库的头文件,其中的cos函数位于全局命名空间;而cmath是C++标准库头文件,它会把C数学函数放到std命名空间,同时多数编译器为了兼容旧代码,也会把这些函数导入到全局命名空间——这就是你测试时cos(x)和std::cos(x)可能没差异的原因。
要明确调用math.h中的cos,最稳妥的方式是:
- 使用全局命名空间前缀
::,直接写::cos(x),这样会强制调用全局作用域中的版本(也就是math.h里的实现),完全避开std命名空间的同名函数。
修改你的测试代码如下:
#include <math.h> #include <cmath> int main() { double x; int maxv = 1000000; for(int i = 0; i < maxv; i++) { x = static_cast<double>(i) / static_cast<double>(maxv); printf("diff = %lf\n", ::cos(x) - std::cos(x)); // 明确全局版本(math.h) vs std版本(cmath) } return 0; }
另外,如果你的代码不需要cmath的其他内容,也可以直接去掉#include <cmath>,此时cos(x)自然就是math.h中的版本,但这种方式仅适用于不需要cmath的场景。
内容的提问来源于stack exchange,提问作者jdl
相关产品推荐
相关产品推荐

