1. 不只有一個 expression 的 macro
2. 使用 code block 解決會發生什麼問題?
3. do-while
的寫法
4. 參考資料
如果以下的兩個 expression 想要寫成 macro:
gets(s);
puts(s);
可以被定義成:
#define ECHO(s) (gets(s), puts(s))
如果寫成這樣會有問題:
// buggy !
#define ECHO(s) { gets(s); puts(s); }
問題在於使用 if-else
語法時如果寫成
if (echo_flag)
ECHO(str);
else
gets(str);
會變成
if (echo_flag)
{ gets(s); puts(s); };
else
gets(str);
這樣了話 if
會跟 else
接不上,error
當然也可以寫成把ECHO(str);
的分號刪掉,這樣就沒問題了,
不過程式碼會變得很奇怪:
if (echo_flag)
ECHO(str)
else
gets(str);
do-while
的寫法寫成這樣比較漂亮,因為 do-while
後面本來就需要加分號,
所以前面的問題都可以解決:
#define ECHO(s) \
do { \
gets(s); \
puts(s); \
} while(0)
C Programming: A Modern Approach, 2/e