Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么GCC允许在C++;即使有ansi和迂腐的旗帜?_C++_Gcc_Rounding_C++98 - Fatal编程技术网

C++ 为什么GCC允许在C++;即使有ansi和迂腐的旗帜?

C++ 为什么GCC允许在C++;即使有ansi和迂腐的旗帜?,c++,gcc,rounding,c++98,C++,Gcc,Rounding,C++98,这个程序在GCC下编译,即使带有-ansi和-pedantic标志,有什么好的理由吗 #include <cmath> int main (int argc, char *argv []) { double x = 0.5; return static_cast<int>(round(x)); } #包括 int main(int argc,char*argv[]) { 双x=0.5; 返回静态_铸造(圆形(x)); } 这将编译干净(甚至没有

这个程序在GCC下编译,即使带有
-ansi
-pedantic
标志,有什么好的理由吗

#include <cmath>

int main (int argc, char *argv [])
{
     double x = 0.5;

     return static_cast<int>(round(x));
}
#包括
int main(int argc,char*argv[])
{
双x=0.5;
返回静态_铸造(圆形(x));
}
这将编译干净(甚至没有警告)的
g++-ansi-pedantic-Wall test.cpp-o test

我看到两个问题:

在ISO一致性模式(C99)中,LI> <代码>循环()/<代码>不可用于C++
  • 即使在这种情况下
    round()
    可用,也只能从
    std
    名称空间中使用

  • 我错了吗?

    我在这里可能有点离谱,但gcc的-ansi标志不适用于代码构造(即,禁用gcc语言扩展),而不是将所有库也切换到严格符合ansi的模式吗?

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

    。它已经存在了令人惊讶的很长一段时间。显然,还没有足够的集体意愿来解决这个问题。用一个新的C++版本,它将采用C99函数从数学.h看来,它似乎永远不可能被修复。

    GCC的人页说明当ANSI标志被设置时,某些函数将不被定义,但不是只有ANSI函数将被定义。defined@josefx当前位置请参阅我对D.Shawley的评论。经过进一步研究,我了解到库扩展不能“改变格式良好的程序的行为”。因此,在我看来,向库中添加
    round()
    扩展是非法的,这使得
    -ansi
    标志的行为毫无意义。好吧,这可能是真的,但根据GCC手册,
    -ansi
    的目的是禁用所有非标准扩展。任何此类附加库函数都将是标准的扩展(标准是否允许此类扩展与此问题无关)。我应该修改我之前的评论:
    -ansi
    禁用冲突扩展,而
    -pedantic
    应该禁用所有扩展。实际上,我已经看过C和C++标准,尽管它们允许附加的库函数,但是这些扩展不能“改变任何格式良好的程序的行为”。这意味着它们不能保留任何额外的标识符(即,定义自己的round()函数的格式良好的程序将被库用自己的round函数扩展标准所破坏)。任何附加库函数必须具有已保留的名称,例如
    \u Round()