GCC では、ansi フラグや衒学的なフラグを使用した場合でも、C++ でのround() の使用が許可されるのはなぜですか?

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

  •  19-09-2019
  •  | 
  •  

質問

このプログラムが 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 つの問題があると思います。

  1. round() ISO 準拠モードの C++ では利用できないはずです (C99 からのものであるため)
  2. たとえ round() この場合は利用可能でしたが、それは、 std 名前空間

私が間違っている?

役に立ちましたか?

解決

これはバグです。驚くべきことに、長い間の周りされています。どうやら、それを修正するために集団的願望の足りませんでした。 math.hからC99の機能を採用する角を曲がったところにC ++の新バージョンでは、それが今までに修正される予定とは思えない。

他のヒント

私はここにベースから外れかもしれないが、GCCの-ansiフラグは、コード構成には適用されませんというだけでなく、厳密なANSI準拠モードにすべてのライブラリを切り替えるよりも(すなわち、GCC の言語の拡張機能を無効にしますか)?

私は、規格がシンボルが定義されており、それらが定義されているヘッダーにすることが必要とされるものを指定していることを信じています。私は、規格が他のシンボルが定義されていないことができることを述べることを信じていません。ポイントにより、std::round()を定義することができますround()と呼ばれる無料のシンボルで定義されることはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top