为什么 GCC 允许在 C++ 中使用 round(),即使带有 ansi 和 pedantic 标志?

StackOverflow https://stackoverflow.com/questions/1882689

  •  19-09-2019
  •  | 
  •  

即使使用 -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.

我看到两个问题:

  1. round() 不应该在 ISO 符合模式下供 C++ 使用(因为它来自 C99)
  2. 即使 round() 在这种情况下可用,它应该只从 std 名称空间

我错了吗?

有帮助吗?

解决方案

这是一个错误. 。它已经存在了令人惊讶的很长一段时间。显然,解决这个问题的集体意愿还不够。随着新版本的 C++ 即将采用 math.h 中的 C99 函数,它似乎不太可能被修复。

其他提示

我可能在这里偏离了基础,但 gcc 的 -ansi 标志不适用于代码构造(即禁用 GCC 语言 扩展)而不是将所有库也切换到严格的 ANSI 兼容模式?

我相信标准指定了需要定义哪些符号以及在哪个标头中定义它们。我不认为标准规定不能定义其他符号。更重要的是, std::round() 不会被称为自由符号的定义 round() 可以定义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top