C++プロジェクトでWarningの存在を重視
最近需要に応じて、プロジェクトの中のwarningに対してクリアを行って、PGがLinuxとWindowsの下でプログラミングする相違性に対する認識が足りないと感じて、多くのコンパイルWarningを派生して、私は悲しくて修復するしかありません.C++Javaほど随意ではなく、プロジェクトの最下層としてWarnigを重視することで、コードの頑丈性を維持し、潜在的なBugを修復することができます.また,今後はlibとして第三者に供給することを考慮し,0 Warningを保持することが必要となる.次に、主に遭遇するWarning発生点について説明します.
(注:テスト推奨オンラインコンパイラの使用http://codepad.org/)
1.format warning
%x 16進法で情報を印刷すると、ちょっと気をつけないとwarningかもしれません.16進法自体は符号なしですが、一致するタイプはunsigned intです.Windowsではintとlongは同じと思われますがLinuxではlong!=int(Linuxではlongはマシンワード長に関連しており、32ビットマシンが4バイト、64ビットマシンが8バイトを占有しているが、Windowsではいずれも4バイトでintに等しい)であるため、%xでunsigned longをマッチングすることはできない.
2.comparison warning
signed変数とunsigned変数を比較すると、このような警告が発生します.たとえば、sizeofとstrlenを使用する場合、その戻りタイプに従ってsize_を使用することに慣れています.tは戻り値を受信し、intまたはlongタイプ変数と直接比較するとwarningが表示されます.size_tは標準Cライブラリで定義され、unsigned intであるべきであるが、64ビットシステムではlong unsigned intである.このような場合、比較しなければならない場合は、符号なしで記号変換することをお勧めします.
3.reorder initialize warning
これはクラスの使用中に現れ、主に構造関数が初期値テーブルでメンバー変数の初期化を行う場合、メンバーの初期化順序がクラスで定義された順序と一致しないためである.G++をコンパイルすると、この問題が見つかります.
4.missing braces warning
構造体がネストされて使用されると、初期化が規範化されず、このような警告が発生します.
以上の構造を定義し、初期化時に簡単に0を付与すると、ツール検出時にいくつかのwarningが爆発するので注意が必要です.
構造体変数の初期化に遭遇するか、memset関数を使用して不要なトラブルを回避することを推奨します.
しばらくいくつかの見落としやすい問題をリストして、更に補充する機会があって、後で符号化する時、多く規範に注意して、不要なWarningを避けます.
(注:テスト推奨オンラインコンパイラの使用http://codepad.org/)
1.format warning
%x 16進法で情報を印刷すると、ちょっと気をつけないとwarningかもしれません.16進法自体は符号なしですが、一致するタイプはunsigned intです.Windowsではintとlongは同じと思われますがLinuxではlong!=int(Linuxではlongはマシンワード長に関連しており、32ビットマシンが4バイト、64ビットマシンが8バイトを占有しているが、Windowsではいずれも4バイトでintに等しい)であるため、%xでunsigned longをマッチングすることはできない.
2.comparison warning
signed変数とunsigned変数を比較すると、このような警告が発生します.たとえば、sizeofとstrlenを使用する場合、その戻りタイプに従ってsize_を使用することに慣れています.tは戻り値を受信し、intまたはlongタイプ変数と直接比較するとwarningが表示されます.size_tは標準Cライブラリで定義され、unsigned intであるべきであるが、64ビットシステムではlong unsigned intである.このような場合、比較しなければならない場合は、符号なしで記号変換することをお勧めします.
3.reorder initialize warning
これはクラスの使用中に現れ、主に構造関数が初期値テーブルでメンバー変数の初期化を行う場合、メンバーの初期化順序がクラスで定義された順序と一致しないためである.G++をコンパイルすると、この問題が見つかります.
4.missing braces warning
構造体がネストされて使用されると、初期化が規範化されず、このような警告が発生します.
struct INER{
int m_i;
};
struct EXTE{
INER m_iner;
int m_i;
};
以上の構造を定義し、初期化時に簡単に0を付与すると、ツール検出時にいくつかのwarningが爆発するので注意が必要です.
EXTE exte={0};
構造体変数の初期化に遭遇するか、memset関数を使用して不要なトラブルを回避することを推奨します.
しばらくいくつかの見落としやすい問題をリストして、更に補充する機会があって、後で符号化する時、多く規範に注意して、不要なWarningを避けます.