次のようなコンパイル時のアサートがたくさんあります。
CASSERT(isTrue) or CASSERT2(isTrue, prefix_)
GCCでコンパイルすると、'prefix_LineNumber' defined but not used
。コンパイル時アサートの警告を非表示にする方法はありますか? GCCのドキュメントを検索することはできませんでした。同じマクロ内でvarが自動的にグローバルに使用される可能性があると思いましたが、それを行う方法は考えられませんでした。
GCCでその警告を隠す方法を知っている人はいますか?
この問題の解決策を探しているときに、このスレッドを見ました。私が見つけた解決策を完全にするためにここに投稿します...
未使用の warnings を制御するGCCコンパイラフラグは次のとおりです。
-Wunused-function
-Wunused-label
-Wunused-parameter
-Wunused-value
-Wunused-variable
-Wunused (=all of the above)
これらのそれぞれには、Wの後に「no-」が挿入された対応する否定形式があり、警告をオフにします(たとえば、-Wallによってオンになった場合)。したがって、あなたの場合には、使用する必要があります
-Wno-unused-function
もちろん、これはコンパイル時のアサートだけでなく、コード全体で機能します。機能固有の動作については、 機能属性 をご覧ください。
GCCが他のコンパイラとの競合を引き起こさない解決策
#ifdef __GNUC__
#define VARIABLE_IS_NOT_USED __attribute__ ((unused))
#else
#define VARIABLE_IS_NOT_USED
#endif
int VARIABLE_IS_NOT_USED your_variable;
Nullステートメントを作成し、結果をvoidにキャストできます。これはコンパイラー間で移植可能であり、gccは-Wall
および-Wextra
が有効になっていても警告を出しません。例えば:
int var; // var is not used
(void)var; // null statement, cast to void -- suppresses warning
一般的な手法は、このためのマクロを作成することです:
#define UNUSED(x) ((void)(x))
int var;
UNUSED(var);
これは最も厄介な警告の1つですが、デッドコードをチェックするのが(時々)役に立つことがわかりますが。しかし、通常、デバッグ用の静的関数、または将来いつか役立つ可能性のある関数、または一時的にのみ使用される関数があり、それらをコード内に保持したいと考えています。
幸いなことに、この警告はインライン関数を気にしません。
inline static foo()
{
}
#define UNUSED_VAR __attribute__ ((unused))
変数の場合は、たとえば、型の前に上記のマクロを使用するだけです。
UNUSED_VAR int a = 2;
これは、静的アサートマクロの詳細を知らずに答えることは困難です。おそらく、この問題を回避するために別のマクロに変更できますか?提案されたようにマクロに「未使用」属性を追加するか、CASSERT()の別の形式を使用することができます。
いくつかの選択肢の説明を次に示します。
http://www.jaggersoft.com/pubs/CVu11_3.html
http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html
-Wunused-label
?
この関数を次のディレクティブでラップします。プッシュとポップの間に配置されるすべてのコードは、未使用の関数について警告しません。コードの残りの部分(プッシュおよびポップ以外)は影響を受けません。
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-function"
... your code
#pragma GCC diagnostic pop