最初の例のように、関数名が欠落している場合、それは「括弧演算子」ではありません。これは、演算子とオペランドの間の関連付けを変更する式の単なる構文要素です。この場合、単に何もしません。あなたが持っているのはただの表現です
"Hello world";
typeの値に評価され、char *
その値は無視されます。その式を冗長なペアで囲むことができます()
("Hello world");
これは何も変更しません。
まったく同じ方法で書くことができます
(5 + 3);
コードの途中で value8
に評価される式を取得します。これはすぐに破棄されます。
通常、コンパイラは、副作用のない式ステートメントのコードを生成しません。実際、C 言語では、すべての式ステートメントの結果が破棄されるため、"意味のある" 式ステートメントは、副作用のある式ステートメントだけです。コンパイラは通常、効果のないステートメントを検出して破棄するのが得意です (警告が表示される場合もあります)。
警告は迷惑になる可能性があるため、次のような効果のない式ステートメントを記述します
"Hello world";
良い考えではないかもしれません。通常、コンパイラはへのキャストをvoid
、この警告を生成しない要求として認識します
(void) "Hello world";
したがって、それに応じてマクロを再定義することを検討してください。
もちろん、上記の手法を使用する場合、マクロの引数として副作用のあるtrace
ものを指定する場合は、覚えておく必要があります。
trace("%d\n", i++);
次に、「無効」形式では、次のようになります
("%d\n", i++);
(コンマ演算子で 1 つの式に連結された 2 つの部分式)。この場合、インクリメントの副作用はi
持続し、無効にはなりません。全体がプレーンと同等です
i++;
また、関数呼び出しを引数として使用する場合
trace(get_trace_name());
「無効」フォームは次のようになります
(get_trace_name());
get_trace_name()
コンパイラは、への呼び出しを破棄する必要があることを認識できるほど賢くない可能性があります。したがって、マクロを使用するときは注意してください。もちろん、実際のトレースを無効にするときに副作用を保持することが意図されている場合を除き、副作用のある引数を避け、関数呼び出しのある引数を避けてください。