私はこれが私達のマクロCマクロの展開はどのように機能しますか?
#define rsAssert(v) if(!(v)) printf("rsAssert failed: %s, in %s at %i" #v, __FILE__, __LINE__);
ケース1でのサンプルコードで
を私の混乱を説明しましょう:
int main(void)
{
rsAssert(0);
return 0;
}
この場合は、正常に
ケース2
をコンパイルint main(void)
{
rsAssert(0) // note here ; is not present
return 0;
}
これもsuccsfully 質問1コンパイル:それはあなたがそれらの間に差をrsAssert(0)
を書きませんかrsAssert(0);
か意味
を?
その後、
ここケース3
int main()
{
if(1)
rsAssert(0);
else
printf("mr.32");
return 0;
}
rsassert(0);
は、[コンパイルhttp://ideone.com/7dFv1]しかしを見に行くされていない;
rsasser(0)
が正常に動作せずに[私は
.. http://ideone.com/8fehl]見ますマクロexで何が起こっていないかここにパンション...
オハイオ州のおかげで、すべてのものが得られました。ケース1の場合、もう1つあります。空文であり、ケース2が完全であるがケース2の場合はrsassert(0)を使用する。ケースエクストラ;問題が発生します... –
はい。簡単に言えば、Cでのマクロ置換を見ると、文字通りファイルにコピーされたばかりです。彼らは本当に自分のセマンティクスを持っていません。 –