GCC およびその他の C++ コンパイラを非常に厳密にする
-
20-08-2019 - |
質問
私は、さまざまな Linux、OS X、Windows で開発および実行される大規模な共同 C++ プロジェクトに取り組んでいます。GCC、Visual Studio C++、およびインテル C++ コンパイラーを使用して、これらのプラットフォーム間でコンパイルします。プロジェクトのコード開発を始める人が増えるにつれ、特定のオペレーティング システム上の特定のコンパイラに特有の、コンパイルおよびランタイムでの奇妙なエラーが見られるようになりました。この例としては、特定の OS とコンパイラのペアが見つけたと思われるヘッダーを暗黙的に組み込み、派生クラスの基本クラスから関数を誤ってオーバーロードしてしまうことが挙げられます。
私の目標は、GCC でのコンパイルをより厳密にし、すべてのプラットフォームでより多くのエラーを検出して、これらの問題に遭遇し続けることがないようにすることです。これは、Google と GCC のマニュアル ページで見つけた、GCC で試してみようと考えているフラグのリストです。
- -壁
- -ウィエクストラ
- -Winit-self
- -Wold-style-cast
- -Woverloaded-virtual
- -Wuninitialized
- -欠落宣言
- -Winit-self
- -アンシ
- -衒学的な
GCC (およびそれほど重要ではない Visual Studio C++ とインテル C++ コンパイラー) を C++ 言語のより厳格な標準に準拠させるために使用される他のフラグは何ですか?これらの一部はすべてのコンパイラのすべてのバージョンに実装されていない可能性があるため、どのコンパイラとバージョンについて話しているのかを具体的に示してください。
他のヒント
あなたは-pedantic-errors
とエラーに知識をひけらかすの警告を行うことができます。これは、それを無視してから、開発者を防ぐことができます。それは(そうでないかもしれないあなたの中が)いくつかのケースでは逆効果であってもよい言えば、あなたは-Werror
と同様のエラーにすべての警告を作ることができます。
全体的に、私は、-pedantic
オプションが最も役に立つ行く限り厳格な標準に付着したとして、考えてます。
-pedantic-エラーます。
(1)の GCCの詳細を参照してください。
コピーしてマスターcmakeのファイルに行の下に貼り付けます。線の下に、より厳格な自分をテストするために、ほとんどの最も有用なコンパイラフラグを備えます。
set(CMAKE_CXX_FLAGS "-O0 -fno-elide-constructors -pedantic-errors -ansi -Wextra -Wall -Winit-self -Wold-style-cast -Woverloaded-virtual -Wuninitialized -Wmissing-declarations -Winit-self -std=c++98")
あなたはcmakeのを使用してはいけない場合は、のちょうど二重引用符で、あなたのコンパイラの
に送信フラグをコピーしますと同様に、あなたはまた、-pendantic
スイッチを提供する必要があり-std
。あなたは厳しいコンパイルが必要な場合、あなたは、あなたがに準拠しようとしているものを標準知っている必要があります。一般的に、現在のC ++のために、これは-std=c++98
されるだろう。 (-ansi
はC ++モードで同様の機能を実行するが、より明確-std=
である。)
、似たような状況で、私たちはあきらめ、 ACEフレームワークするに移動しましたプラットフォームの違いを隠します。
私はブログ記事を書きましたこのトピックに関するいくつかのオプションを研究しました。また、あなたが他のライブラリを使用しているケースを処理する必要があるが、彼らは、厳密なコンパイルを次されていません。幸いなことだけでなく、それらを処理するための簡単な方法があります。私はすべての私のプロジェクトで広くこれを使用しています。
要するに、非常に厳格なモードをオンにするコンパイラオプションを以下の使用(以下は、私がCMakeLists.txtに入れるものです):
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wstrict-aliasing -pedantic -fmax-errors=5 -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option ${CMAKE_CXX_FLAGS}")
あなたはここにコードの特定の部分のために、これstrictモードオフにする方法についての詳細を読むことができます:<のhref = "http://shitalshah.com/p/how-to-enable-and-use-gcc -strictモードコンパイル/」のrel = "nofollowをnoreferrer"> http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ の