誰かがC++コンパイラがconstの正確性を強制するのに役立つという警告を知っていますか?例えば、メソッドの内部で決して変更されない非constパラメータを含むC++メソッドによって警告が生成されるとよいでしょう。私は、-Wsuggest-attribute = constと呼ばれるgnuコンパイラ警告があることを知っています。しかし、このフラグを使用すると、認識されないというエラーが表示されます。なぜどんなアイデア?Const正しさの警告C++
答えて
私はこのような警告は存在しないと主張しています。パラメータがコール内で変更されていないからといって、単にそのためにconst
にする必要はありません。
virtual
を考えてください。おそらく、基本クラスの設計者は、基本クラスのパラメータを変更していないにもかかわらず、そのパラメータを変更するかどうかにかかわらず、拡張クラスにそのパラメータを残したいと考えています。
また、インターフェイスやAPIの変更など、大規模なアプリケーションについて考えることもできます。今すぐパラメータを変更する必要はないかもしれませんが、今後これを行う予定です。現在はconst
にするつもりはありません。完全に再構築するようにしてください。const
を削除すると、今後エラーが発生する可能性があります。
私はあなたのポイントを見ます。しかし、私はまだこれが警告(おそらくエラーではない)として役立つと思います。さらに、-Wsuggest-attribute = constと呼ばれるgnuコンパイラのフラグがあるようです。私のg ++コンパイラはそれを認識しません。 – user809409
コンパイラで実行している機能はありませんが、今すぐオンにしてから提案をレビューするのが良いでしょう。関数が変数を変更しないことが分かっている場合は、const変数を渡すことができるようにconstにすることをお勧めします。 – Darinth
[Rust](https://www.rust-lang.org/en -US /)はこの機能(不要な 'mut')を持っています。これはC++に戻ってAPIとローカル変数がデフォルトで不変であることを確認しようとしています。 – phoenix
いいえ、残念ながら、このような警告はありません。 const宣言されたパラメータを変更しようとするとエラーになります。これは、紛失したconst
の宣言がコンパイラの観点からコードの正確さを変更しないためです。しかし、constの正確さは、コンパイラが潜在的な最適化を発見する上で重要であり、コードの可読性を向上させます。それはプロフェッショナリズムの問題です。特に参照を使うときは、正確さは必須です。 I often refer to this.
演算子(代入、変換、...)が有効になると、コンパイラ自体が非常に深刻な状態になります。ここにはconst
がありません。コンパイラは、指定されたパラメータが変更される可能性がある場合に大きな違いが生じるため、演算子の使用を拒否します。
慎重に、このようなconst
パラメータ:
void myFunc(int const param);
ないは、インタフェースに属しありません。これは、関数の実装のローカルスコープに属します。実際には、この機能:
int inc(int const param) { return param+1; }
は、変数を変更しますが、実際にそれをしない権利を主張するのconst正しパラダイムの違反ではありません
int inc(int param);
として宣言することができます。
const_cast
が心配な場合は、最初に使用しないでください。コードベースでgrep
を使用することもできます。
私はこのような警告を知らないので、コンパイラで実装するのがむしろ難しいと思っています。つまり、遅くなるでしょう。たぶん、いくつかの静的解析ツールにそのような機能があるかもしれません(しかし、私はこれらの機能も認識していません)。
Wsuggest-attribute=const
によると、それは別のものです。基本的には、値(ポインタなし)のみを受け取り、静的/大域状態を読み込んだり変更したり、値(ポインタなし)しか返さないgcc特有の "関数属性const
"を使うことを提案します。 。さらに詳細については、ここを見て:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
-Wsuggest-attribute=const
をこの分析は、オプション "constの正しさ" はない
-O
と高い
- 1. C++警告: "ポインタパラメータ" arr "constへのポインタ"
- 2. C++のconst-正しさとconstのメンバー
- 3. C++型警告
- 4. 警告メッセージが正しく
- 5. C#ログインメッセージの警告
- 6. のVisual C++の#pragma警告
- 7. リンカの警告C++ Visual Studio
- 8. C++のコードメトリックと警告
- 9. 不正なオフセット警告の修正
- 10. tf.contrib.learnクイックスタート:修正float64警告
- 11. 警告:不正なオフセットタイプ
- 12. 古い警告をカスタマイズして、レベル2の警告ではなくレベル4の警告をC#
- 13. 警告は警告
- 14. 変更のconstプリミティブのみ生成する警告
- 15. C++コンパイルの新しい警告フィルタ
- 16. モノ投げ警告が正しい
- 17. 変更されていない非const変数の警告の取得
- 18. 奇妙な警告C
- 19. C++文字列(ナブ警告)
- 20. 警告:データ引数[-Wformat] C++
- 21. Visual Studio C#参照 - 警告
- 22. Cコンパイラの警告「警告:フォーマットの引数が多すぎます」修正方法?
- 23. ビジュアルスタジオのC警告のみを報告します
- 24. Objective-C警告RunUnitTestsは廃止されました。 Xcodeの7
- 25. SSLエラー:不正なパラメータの警告
- 26. Wunknown-pragmas gcc警告の修正方法
- 27. 警告CS1707の修正方法は?
- 28. RestKit警告 - 警告:ネストされたオブジェクトのマッピングに失敗しました:(null)
- 29. 77 Debug(Objective-C)でコンパイルするときにunsigned long const警告が表示される
- 30. "警告なし;"
で、デフォルトで有効になって
が必要です実際にはメソッドの引数やローカル変数と関係があります。 cppcheckは、クラスメソッドに対してスタイル警告を送出することができます。 –
'-Wsuggest-attribute'は、GCC固有の関数属性についてのものであり、constの正確性に関するものではありません。 '__attribute __((const))'は 'constexpr'と多少似ています。 – Philipp