巨集定義中if語句的用法

2021-07-22 11:34:34 字數 879 閱讀 8582

當巨集定義中含有 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...