讓我解釋一下我的示例代碼混淆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] ..
我沒有得到宏前的事情pansion在這裏...
哦,謝謝了它的整個事情..在情況1它有一個;這是空的語句,並在情況2是完美的,但情況2使用rsassert(0);額外的案件;這造成問題... – 2012-02-26 06:17:07
是的。簡單地說,當在C中查看宏替換時,它幾乎可以直接複製到文件中。他們並沒有真正的自己的語義。 – 2012-02-26 15:50:56