フラグを使用してコードをコンパイルするのが好きです。
$gcc prog1.c -o prog1.x -Wall -Wextra -ansi -pedantic-errors -g -O0 -DDEBUG=1
そして、避けるために、-Wunused-result
私は別のフラグを追加するという考えが好きではありません:(-Wno-unused-result
もしそうなら、それは1つの解決策です)。
(void)
私は以前、いくつかの関数にキャストしていましprintf
た(コンパイラーはそれらについて警告しないので、奇妙な関数だけで、他の有名な関数ではありません)。toのキャストが(void)
機能しなくなりました(GCC 4.7.2)
面白い副子はアドバイスします:
Result returned by function call is not used. If this is intended,
can cast result to (void) to eliminate message. (Use -retvalother to
inhibit warning)
しかし、これはもはや解決策ではありません。Splintは、この問題に関する更新が必要です。
したがって、非常に互換性のある方法で警告を取り除くために、ここに良いものがありMACRO
ます:
/** Turn off -Wunused-result for a specific function call */
#define igr(M) if(1==((long)M)){;}
そしてそれをこのように呼んでください:
igr(PL_get_chars(t, &s, CVT_VARIABLE));
その見た目はすっきりしていて、どのコンパイラもコードを排除します。私の好みの編集者の写真を下に示してvi
ください:左のウィンドウ、いいえigr()
; 中央のウィンドウ、igr()
;を使用 右ウィンドウ、ソース。

まったく同じで、Gccが許可しないことをCに実行させる完全に無害なコードを見ることができます。戻りコードを無視してください。
比較1==...
は、この条件がnoであるというスプリント警告を回避するためにのみ必要ですBOOL
。GCCはそれほど気にすることはできませんでした。機能によっては、cast
警告が表示される場合があります。このマクロを無視してテストをしてdouble
良かったのですが、どういうわけか完全には納得できません。特に、関数がポインタまたはより複雑なものを返す場合。
この場合、次のものも必要になります。
#define pigr(M) if(NULL==((void *)M)){;}
最後{;}
に、警告のために必要です-Wempty-body
('if'ステートメントで空の本体を中括弧で囲むことをお勧めします)。
そして(今最後に);
関数呼び出しの後は(厳密に)必要ではありませんが、その良い習慣です。コード行をより均質にし、すべてがで終わるようにし;
ます。(ニーモニックとして変換され、NOP
最適化後に消えます)。
コンパイラを実行しても、警告やエラーは発生しません。実行splint
すると:
$ splint ./teste.c -I/usr/lib/swi-prolog/include/ -strict-lib
Splint 3.1.2 --- 20 Feb 2009
Finished checking --- no warnings
この回答も参照してください