一 巨集定義(3) 檢視巨集展開

2021-06-09 16:15:58 字數 1078 閱讀 3902

從乙個巨集定義開始說起

#define

mul( a,b) a * b

乍看之下這個巨集定義並沒有什麼問題,但是當你採用如下用法的時候就會出現問題了

int main(char * argv ,intargc)

執行後輸出:

可以看到結果並不是我們預期的 5*9 =45, 這個時候我們可能就會想到怎麼去檢視巨集展開後是變成怎樣的**呢?

在vs2008 或者vs2010 中我們可以選擇屬性 –》預編譯選項–》編譯檔案選擇產生檔案,如下所示:

我們會在debug資料夾下看到對應的原始檔名稱字尾為.i的檔案產生,將他開啟,跳轉到main函式裡面,我們將看到 main函式變成了:

int main(char * argv ,int argc) 

由此我們可以很清楚的看到為什麼結果會是19了(先乘除後加減)12+7=19.。。

當然從這個例子中我們也要注意到乙個巨集定義的小技巧,或者可以視為一種小規範吧,那就是引數最好都用括號括起來,防止產生優先順序的問題

如果我們將mul定義為

#define

mul( a,b)( a) * (b)

那麼展開後就會是:

int main(char * argv ,int argc)

輸出就為45 了

linux 下的話可在 編譯選項裡加上 –e  -o 輸出的檔名 也可以達到一樣的效果:

如:

g++ -c define.cpp –e –o define.i

我們就可以在define.i 看到相同的資訊了

巨集定義的巨集展開錯誤

巨集定義自身的缺陷是指巨集展開錯誤,主要是由於運算子優先順序等原因,使得巨集展開後的語義與餘項發生偏差。define max a,b a b?a b define mul a,b a b int main int x 4.y 3 int max max x,y 2 int product mul x...

巨集定義中 和 符號的使用和巨集定義展開問題

程式如下 include define f a,b a b define g a a define h a g a intmain 答案 第一行 12 第二行 f 1,2 說明 1 關於符號 和 兩個符號都只能用於預處理巨集擴充套件。不能在普通的原始碼中使用它們,只能在巨集定義中使用。簡單的說,是把...

abs int 巨集定義 巨集定義和巨集方法

巨集定義和巨集方法 定義機型 define is iphone5 uiscreen instancesrespondtoselector selector currentmode cgsizeequaltosize cgsizemake 640,1136 uiscreen mainscreen cu...