为什么 GCC 允许在 C++ 中使用 round(),即使带有 ansi 和 pedantic 标志?
题
即使使用 -ansi
和 -pedantic
旗帜?
#include <cmath>
int main (int argc, char *argv [])
{
double x = 0.5;
return static_cast<int>(round(x));
}
这编译干净(甚至没有警告) g++ -ansi -pedantic -Wall test.cpp -o test
.
我看到两个问题:
round()
不应该在 ISO 符合模式下供 C++ 使用(因为它来自 C99)- 即使
round()
在这种情况下可用,它应该只从std
名称空间
我错了吗?
解决方案
这是一个错误. 。它已经存在了令人惊讶的很长一段时间。显然,解决这个问题的集体意愿还不够。随着新版本的 C++ 即将采用 math.h 中的 C99 函数,它似乎不太可能被修复。
其他提示
我可能在这里偏离了基础,但 gcc 的 -ansi 标志不适用于代码构造(即禁用 GCC 语言 扩展)而不是将所有库也切换到严格的 ANSI 兼容模式?
我相信标准指定了需要定义哪些符号以及在哪个标头中定义它们。我不认为标准规定不能定义其他符号。更重要的是, std::round()
不会被称为自由符号的定义 round()
可以定义。
不隶属于 StackOverflow