2010年12月23日 星期四

展開 min(min(4,2), 3) ?

我們可以在C/C++裡面定義巨集(macro),例如:

#define min(a,b) (a) < (b) ? (a) : (b)

在程式裡使用巨集,編譯時前置處理器(preprocessor)會將巨集展開之後,編譯器再對展開後的程式碼作編譯。例如:

min(4,2)

展會後會變成

(4) < (2) ? (4) : (2)

那麼 min(min(4,2), 3) 展開後會是什麼呢?為了查看展開後的程式碼,我們可以在VC的設定裡加上/P參數,然後重新編譯程式,編譯後會產生一個.i檔案,打開.i檔後搜尋到如下巨集展開後的程式碼。

((4) < (2) ? (4) : (2)) < (3) ? ((4) < (2) ? (4) : (2)) : (3)

觀察上面的程式後可以發現到,巨集的展開是先由參數,由內往外層展開。也可以發現到巨集展開的方式,和我們一般的函式呼叫是不同的,如果一個不小心沒有注意到的話,常常會得到預期以外的結果,這點是要特別注意的。
Related Posts Plugin for WordPress, Blogger...