9

別のtrace()マクロでオンとオフを切り替えるマクロがあります。

#ifdef TRACE
    #define trace(x) trace_val(x, 0)
#else
    #define trace(x) 0
#endif

これは、未定義で呼び出すとwarning: statement with no effectgcc から生成されます。少し検索した後、私は変化することを発見しましたtrace()TRACE

#define trace(x) 0

#define trace(x) (void)0

エラーを黙らせます。私の質問は:なぜですか?違いは何ですか?

4

2 に答える 2

8

void へのキャストは、プログラマーが結果を捨てるつもりであることを明確にします。警告の目的は、ステートメントが効果を持たないことが明らかではないことを示すことです。したがって、意図的でない場合にプログラマーに警告するのに役立ちます。ここで警告しても意味がありません。

于 2012-04-05T03:22:45.310 に答える
7

警告と回避策はコンパイラ固有です。ただし、できることは次のとおりです。

#define NOP do { } while(0)

#ifdef ENABLE_TRACE
    #define TRACE(x) trace_val(x, 0)
#else
    #define TRACE(x) NOP
#endif

これにより、そもそも根本的な問題が回避されます。

于 2012-04-05T03:22:59.647 に答える