那么,代码如下:
#include <iostream>
int main() {
std::cout << abs(4.1) << std::endl;
return 0;
}
(特地展示了夹杂物,这里就不说了cmath)。
手头只有Windows。
我们用微软的编译器收集。结论:
4.1
使用 g++ (MinGW) 构建。结论:
4
好吧,什么都不清楚。
让我们连接起来<cmath>。没有什么变化...
我们连接<math.h>。现在在两个编译器上一切都很好。
好的。让我们认为,默认情况下,c-shnaya以某种方式使用abs,与 int 一起操作(对于 g++)。重写代码:
#include <iostream>
int main() {
std::cout << fabs(4.1) << std::endl;
return 0;
}
结论cl:
4.1
g++ 输出:
А фиг вам, <cmath> подключить не хотите-ли?
g++ 输出(连接后<cmath>):
4.1
万岁!
所以,说:
为什么我可以abs在不连接任何东西的情况下使用 - 我明白。我把它打开了<iostream>,这意味着 - 和<stdlib.h>。但是为什么不同的编译器会有这样的差异呢?感觉就像微软的编译器连接到某个地方<math.h>......
顺便一提。问题是关于c-functions的使用abs。我std::abs没有注意到任何问题。
您的代码在这两种情况下都不起作用,因为它 (1) 尝试使用间接包含头文件的效果 (2) 尝试使用非标准函数。对于不同的编译器和具有不同设置的一个编译器,效果可能会随机变化。比如
::std::abs(double从C++17开始,头文件有重载<cstdlib>,但::abs(double可能不会同时有重载。