const の正確性を強制するのに役立つ C++ コンパイラが提供する警告を知っている人はいますか? たとえば、メソッド内で決して変更されない非 const パラメーターを含む C++ メソッドによって警告が生成されると便利です。-Wsuggest-attribute=const; という gnu コンパイラの警告があることがわかりました。ただし、このフラグを使用すると、認識されていないというエラーが表示されます。理由はありますか?
5 に答える
-Wsuggest-attribute=const
この分析にはオプションが必要です
-fipa-pure-const
これはデフォルトで有効になっています
-O
以上
主に役に立たないため、そのような警告は存在しないと思います。パラメーターが呼び出し内で変更されていないからといって、そのためだけにパラメーターを作成する必要があるわけではありませんconst
。
virtual
関数を考えてみましょう。おそらく、基本クラスの設計者は、基本クラスのパラメーターを変更しませんが、そのパラメーターを変更するかどうかを拡張クラスに任せたいと考えています。
また、インターフェイスや API などの変更に多額の費用がかかる大規模なアプリケーションについて考えてみてください。パラメータを今すぐ変更する必要はないかもしれませんが、将来変更する予定です。あなたは今それを作るつもりはなくconst
、完全な再構築を強制し、const
.
注意してconst
ください、このようなパラメータ:
void myFunc(int const param);
インターフェイスに属していません。関数実装のローカル スコープに属します。実際、この関数:
int inc(int const param) { return param+1; }
として宣言することができます
int inc(int param);
変数を変更する権利を主張するが、実際には変更しないことは、const の正確性のパラダイムに違反していません。
心配な場合const_cast
は、最初から使用しないか、単にgrep
コードベースで使用することをお勧めします。
いいえ、残念ながらそのような警告はありません。const 宣言されたパラメーターを変更しようとすると、エラーが発生します。これはconst
、コンパイラの観点からは、宣言が欠落していてもコードの正確性が変わらないためです。ただし、const の正確性は、コンパイラが潜在的な最適化を検出するために重要であり、コードの可読性を向上させます。それはプロフェッショナリズムの問題です。特に参照を使用する場合 const の正確性は必須です。私はよくこれを参考にしています。
演算子 (代入、変換など) が登場すると、コンパイラ自体が const の正確性を非常に重視します。ここに欠落const
があり、指定されたパラメーターが変更される可能性があるかどうかによって大きな違いが生じるため、コンパイラーは演算子の使用を拒否します。
私はそのような警告を認識しておらず、コンパイラに実装するのはかなり難しいと思います。つまり、速度が低下します。一部の静的分析ツールにはそのような機能があるかもしれません (しかし、私はそれらも知りません)。
によるWsuggest-attribute=const
と、それは別のことです。gcc 固有の「関数属性const
」を使用することをお勧めします。これは基本的に、値のみを受け取り (ポインターなし)、静的/グローバル状態を読み取ったり変更したりせず、値のみを返す (ポインターなし) 数学関数です。詳細については、こちらをご覧ください: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes