2011-07-14 16 views
6
ここ

は警告Iで、C++コードにはgccを実行している場合、ウェブ上のそこの人々の多くは、以下を参照してください。gccのオプション "-Wstrict-prototypes"がC++に有効でないのはなぜですか?

cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ 

警告テキストは非常に明確であるが、「C++」[セットにエイダではありません/ C/ObjC]、なぜ私はgccがC++コードをコンパイルするときにこの警告を出すのかについて全く疑問がない。 (このフラグがオンになっているのは、Cコードが主にCコードであるにもかかわらず、警告オプションリストが厳密に選択されているからですが、C++コードが少し追加されています)

私の質問は:なぜこの警告は、警告オプションのC++

gccのドキュメントには有効ではありませんhttp://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Warning-Options.htmlから、次のとおりです。

-Wstrict-プロトタイプ(CのみのObjective-C )引数型を指定せずに関数を宣言または定義した場合に警告する( 旧式の関数定義は、 引数の型を指定する宣言が先行。)

今、私はちょうどを知っている私は、C++について何かを明らかに忘れてんだけど、C++はまた、プロトタイプでの関数の引数の型を指定する必要はないのですか?関数がしばしばメンバ関数であるが、それにもかかわらずプロトタイプではないので、これらの関数プロトタイプはしばしばクラス宣言に含まれていますか?あるいは、それらが単なる良い練習であっても、なぜgccはこのオプションでサポートを提供しないのでしょうか?またはそうでない場合は、C++の並列オプションによって?

答えて

8

私はそれが言語の一部として厳密なプロトタイプを必要としているからだと思います。オプションは余計です。なぜそれがそれを作るので、GCCはそれが私を超えていると不平を言う必要があります。

小さなサンプル/テストのCまたはC++プログラム用のビルドスクリプトにそのオプションが設定されています。警告の種類がわかりました。言語のデフォルトの動作が私のものなので警告する理由はないようです私は頼んでいる。しかし、それがあるので、いつか私を苛立たせると、C++ビルドのオプションを気にしないようにスクリプトを修正します。

+1

私はC++コードの要件に違反した場合、コンパイラは_error_を正しく報告し、コンパイルに失敗するので、_warning_はC++では余分です。 – talkaboutquality

+0

はい、あなたが言及した理由のために、プロトタイプの欠落に関する警告はC++では不必要です。私の意見では、C++で使用される '-Wstrict-prototypes'のGCCの警告は余分です。 gccは黙ってC++のオプションを無視することができます。 –

3

引数の型を指定せずに関数を宣言/定義することは標準では不正です(例:これはC++を真のスーパーセットにしないCとC++の違いの1つです)。

これは法的なC99ですが、合法ではないC++ 03:-Wstrict-prototypesしてコンパイルした場合

void foo(x, y) 
    int x; 
    char *y; 
{ 
    // ... 
} 

GCCはCで、このための警告を与えます。

3

C++標準では、この機能をオンまたはオフにする必要はありません。が常に言語でに設定されています。

0

もう一つの興味深い特殊なケース:Cのセマンティクスによって

extern int foo(); 

この宣言は、引数の数と型は未指定のままfooの不完全タイプを指定します。これはC99/C11では完全に正当ですが、Wstrictプロトタイプはこの宣言をCで警告します。

C++のセマンティクスでは、この宣言では、引数を取らない関数(つまりextern int foo(void)に相当)としてのfooの完全型が指定されています。したがって、-Wstrict-prototypesはC++のこのケースには関係ありません。

関連する問題