2011-01-22 103 views

回答

2

宏是由預處理程序(在編譯正確開始之前)被代入您的程序的代碼片段。這可能是一個功能塊,或者它可能是一個常數值。

使用函數式宏時的警告。請看下面的代碼:

#define foo(x) x*x 

如果你打電話foo(3),它將成爲(和被編譯成)3*3(= 9)。相反,如果您撥打foo(2+3),它將變成2+3*2+3,(= 2 + 6 + 3 = 11),這不是您想要的。另外,由於代碼被替換,因此foo(bar++)變爲bar++ * bar++,使bar遞增兩次。

宏是強大的工具,但它可以很容易地拍攝自己的腳,而試圖做一些與他們看中的東西。

3

宏是一個預處理器指令,用於定義在編譯之前預處理器將替換(或刪除)的名稱。

例子:

#define MY_MACRO1 somevalue 
#define MY_MACRO2 
#define SUM(a, b) (a + b) 

那麼如果在代碼(除字符串)中任何地方存在的MY_MACRO1MY_MACRO2一提的預處理與在#define行名稱後無論發生什麼事替換此。

還可以有宏的參數(如SUM)。在這種情況下,預處理器能夠識別的參數,例如:

int x = 1, y = 2; 
int z = SUM(x, y); 

預處理器替換這樣的:

int x = 1, y = 2; 
int z = (x + y); 

僅此更換後的編譯器得到編譯生成的代碼。

+0

感謝您的回覆。關於「#定義SUM(a,b)(a + b)」,我們應該總是包括a + b之間的+ b嗎?謝謝。 – Simplicity 2011-01-22 09:32:19

+0

@SWEngineer在這種情況下,它不會使用圓括號,但考慮以下代碼:int z = SUM(a,b)* 3;如果SUM沒有括號定義,則會擴展爲int z = a + b * 3 ;`,那可能不是你想要的。 – Fiktik 2011-01-22 09:38:34

1

「宏定義」僅指示它們是如何指定的(使用#define指令),而「宏」是定義的函數或表達式。

但是,除了語義之外,它們之間幾乎沒有什麼區別。