C++ 为什么GCC允许在C++;即使有ansi和迂腐的旗帜?
这个程序在GCC下编译,即使带有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)); } 这将编译干净(甚至没有
-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()
。