GCC では、ansi フラグや衒学的なフラグを使用した場合でも、C++ でのround() の使用が許可されるのはなぜですか?
質問
このプログラムが GCC でコンパイルされるのには、十分な理由がありますか? -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
.
2 つの問題があると思います。
round()
ISO 準拠モードの C++ では利用できないはずです (C99 からのものであるため)- たとえ
round()
この場合は利用可能でしたが、それは、std
名前空間
私が間違っている?
解決
これはバグです。驚くべきことに、長い間の周りされています。どうやら、それを修正するために集団的願望の足りませんでした。 math.hからC99の機能を採用する角を曲がったところにC ++の新バージョンでは、それが今までに修正される予定とは思えない。
他のヒント
私はここにベースから外れかもしれないが、GCCの-ansiフラグは、コード構成には適用されませんというだけでなく、厳密なANSI準拠モードにすべてのライブラリを切り替えるよりも(すなわち、GCC の言語の拡張機能を無効にしますか)?
私は、規格がシンボルが定義されており、それらが定義されているヘッダーにすることが必要とされるものを指定していることを信じています。私は、規格が他のシンボルが定義されていないことができることを述べることを信じていません。ポイントにより、std::round()
を定義することができますround()
と呼ばれる無料のシンボルで定義されることはありません。
所属していません StackOverflow