當巨集定義中含有 if 時
1) 定義如下巨集
#define dc(p) if( foo(p) )fun(p)
用在下面的環境中
if(k>n)
dc(k);
else
dc(n);
巨集替換後,如下
if(k>n)
if( foo(k) )
fun(k);
else
if( foo(n) )
fun( n );
可見, 原來的 if 和 else 不再配對.
2) 為了避免這類問題, 我們可以將包含if語句的巨集定義為乙個整體.
#define dc(p)
但是, 替換後變為
if(k>n)
;else ...
由於else前面多了個分號, 編譯時會提示錯誤沒有與else配對的if.
3)因為這些原因, 在巨集定義中, 經常會將語句序列放入 dowhile(0)塊中.
如下#define dc(p) dowhile(0)
替換後if(k>n)
dowhile(0);
else
...程式可以正常執行
4)替換方案
a)採用 ? : 表示式
#define dc(p) ( (foo(p)) ? (fun(p)):0)
b)利用布林運算的短路徑求值屬性
#define dc(p) ( (foo(p)) && (fun(p), 1) )
參考書籍: 《**閱讀方法與實踐》
附例:
#define testerror(errtype, errcode, fmtstring...) doelse}while(0);
巨集定義中 與 的用法
巨集定義中 的功能是將其後面的巨集引數進行字串化操作 stringfication 舉個例子就明白了 define warn if exp do while 0 使用warn if divider 0 被替換為 do while 0 ok,講 了,連線符 concatenator 用來將兩個toke...
巨集定義的用法
有五種用法,含有引數和不含引數,行尾都不用加分號 define 識別符號 替換列表 類似於全域性變數了 如果其他檔案沒有包含定義巨集的檔案,則在巨集定義的位置結束,如果有包含,則到包含的檔案結束 define largest num 1000 define 識別符號 引數列表 替換列表 注意,替換列...
關於巨集定義中 與 的用法
巨集在條件編譯以及各種大規模的定義裡是非常有用的。前面qt原始碼學習筆記裡就有一篇用來介紹巨集的定義。這次主要介紹下巨集定義裡 的作用。關於巨集,注意可以用gcc e test.cpp來檢視預編譯之後的結果。1.先介紹 主要是字串替換的作用。將傳入的符號轉化為字串 直接上源 define marco...