2009-12-10 20 views
6

-ansi-pedanticフラグがあっても、このプログラムがGCCでコンパイルされる理由はありますか?なぜGCCはansiとペダンティックフラグがあってもC++でのround()の使用を許可していますか?

#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つの問題を参照

:(それはC99から来ているので)

  1. round()round()が、この場合に利用可能であったとしても、それが唯一べき
  2. ISO準拠のモードではC++で利用可能であるべきではありませんそうでしょうstd名前空間

私は間違っていますか?

答えて

2

This is a bug。それは驚くほど長い間周りにいた。明らかに、それを修正するための集団的な欲求の十分されていない。 math.hのC99関数を採用する新しいバージョンのC++を使用すると、修正される可能性は低いようです。

0

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

+0

gccのマニュアルページには、ansiフラグが設定されているときに関数が定義されていないが、ansi関数しか定義されていないことが記述されています。 – josefx

+0

@josefx:D. Shawleyへのコメントを参照してください。さらに調査した結果、ライブラリ拡張は "整形式プログラムの動作を変える"ことができないことを学びました。したがって、ライブラリに 'round()'拡張を追加することは不正です。これは、 '-ansi'フラグの動作をmootにします。 –

-1

標準では、どのシンボルを定義する必要があるか、どのヘッダを定義するかを指定していると思います。私は、規格が他のシンボルを定義できないと述べているとは考えていません。さらに多くの点では、std::round()と定義されていないフリーシンボルであるround()を定義することができます。

+0

さて、そうかもしれませんが、GCCマニュアルによる '-ansi'の目的は、すべての非標準拡張を無効にすることです。そのような追加のライブラリ関数は、標準の拡張である(そのような拡張が標準で許可されているかどうかは、この質問の接線です)。 –

+0

私は以前のコメントを修正すべきです: '-ansi'は* conflicting * extensionsを無効にし、' -pedantic'は全ての拡張を無効にすることになっています。 –

+2

実際には、私はCとC++の両方の標準を見てきましたが、追加のライブラリ関数を許可していますが、そのような拡張は "整形式プログラムの動作を変更できません"。これは、追加の識別子(すなわち、それ自体のround()関数を定義する整形式のプログラムは、独自のround関数で標準を拡張するライブラリによって壊れる)を予約できないことを意味します。追加のライブラリ関数は '_Round()'のように*すでに予約されている名前を持たなければなりません。 –

関連する問題