2012-04-14 8 views
20

誰かがC++コンパイラがconstの正確性を強制するのに役立つという警告を知っていますか?例えば、メソッドの内部で決して変更されない非constパラメータを含むC++メソッドによって警告が生成されるとよいでしょう。私は、-Wsuggest-attribute = constと呼ばれるgnuコンパイラ警告があることを知っています。しかし、このフラグを使用すると、認識されないというエラーが表示されます。なぜどんなアイデア?Const正しさの警告C++

+0

で、デフォルトで有効になって

-fipa-pure-const 

が必要です実際にはメソッドの引数やローカル変数と関係があります。 cppcheckは、クラスメソッドに対してスタイル警告を送出することができます。 –

+0

'-Wsuggest-attribute'は、GCC固有の関数属性についてのものであり、constの正確性に関するものではありません。 '__attribute __((const))'は 'constexpr'と多少似ています。 – Philipp

答えて

6

私はこのような警告は存在しないと主張しています。パラメータがコール内で変更されていないからといって、単にそのためにconstにする必要はありません。

virtualを考えてください。おそらく、基本クラスの設計者は、基本クラスのパラメータを変更していないにもかかわらず、そのパラメータを変更するかどうかにかかわらず、拡張クラスにそのパラメータを残したいと考えています。

また、インターフェイスやAPIの変更など、大規模なアプリケーションについて考えることもできます。今すぐパラメータを変更する必要はないかもしれませんが、今後これを行う予定です。現在はconstにするつもりはありません。完全に再構築するようにしてください。constを削除すると、今後エラーが発生する可能性があります。

+2

私はあなたのポイントを見ます。しかし、私はまだこれが警告(おそらくエラーではない)として役立つと思います。さらに、-Wsuggest-attribute = constと呼ばれるgnuコンパイラのフラグがあるようです。私のg ++​​コンパイラはそれを認識しません。 – user809409

+0

コンパイラで実行している機能はありませんが、今すぐオンにしてから提案をレビューするのが良いでしょう。関数が変数を変更しないことが分かっている場合は、const変数を渡すことができるようにconstにすることをお勧めします。 – Darinth

+0

[Rust](https://www.rust-lang.org/en -US /)はこの機能(不要な 'mut')を持っています。これはC++に戻ってAPIとローカル変数がデフォルトで不変であることを確認しようとしています。 – phoenix

0

いいえ、残念ながら、このような警告はありません。 const宣言されたパラメータを変更しようとするとエラーになります。これは、紛失したconstの宣言がコンパイラの観点からコードの正確さを変更しないためです。しかし、constの正確さは、コンパイラが潜在的な最適化を発見する上で重要であり、コードの可読性を向上させます。それはプロフェッショナリズムの問​​題です。特に参照を使うときは、正確さは必須です。 I often refer to this.
演算子(代入、変換、...)が有効になると、コンパイラ自体が非常に深刻な状態になります。ここにはconstがありません。コンパイラは、指定されたパラメータが変更される可能性がある場合に大きな違いが生じるため、演算子の使用を拒否します。

5

慎重に、このようなconstパラメータ:

void myFunc(int const param); 

ないは、インタフェースに属しありません。これは、関数の実装のローカルスコープに属します。実際には、この機能:

int inc(int const param) { return param+1; } 

は、変数を変更しますが、実際にそれをしない権利を主張するのconst正しパラダイムの違反ではありません

int inc(int param); 

として宣言することができます。

const_castが心配な場合は、最初に使用しないでください。コードベースでgrepを使用することもできます。

0

私はこのような警告を知らないので、コンパイラで実装するのがむしろ難しいと思っています。つまり、遅くなるでしょう。たぶん、いくつかの静的解析ツールにそのような機能があるかもしれません(しかし、私はこれらの機能も認識していません)。

Wsuggest-attribute=constによると、それは別のものです。基本的には、値(ポインタなし)のみを受け取り、静的/大域状態を読み込んだり変更したり、値(ポインタなし)しか返さないgcc特有の "関数属性const"を使うことを提案します。 。さらに詳細については、ここを見て:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

0
-Wsuggest-attribute=const 

をこの分析は、オプション "constの正しさ" はない

-O 

と高い

関連する問題