在:http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/C++ - 宏定義指令
它提到了一個名爲 「宏定義」 指令。當我們說「微距」時,我們的意思是什麼?
感謝。
在:http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/C++ - 宏定義指令
它提到了一個名爲 「宏定義」 指令。當我們說「微距」時,我們的意思是什麼?
感謝。
宏是由預處理程序(在編譯正確開始之前)被代入您的程序的代碼片段。這可能是一個功能塊,或者它可能是一個常數值。
使用函數式宏時的警告。請看下面的代碼:
#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
遞增兩次。
宏是強大的工具,但它可以很容易地拍攝自己的腳,而試圖做一些與他們看中的東西。
宏是一個預處理器指令,用於定義在編譯之前預處理器將替換(或刪除)的名稱。
例子:
#define MY_MACRO1 somevalue
#define MY_MACRO2
#define SUM(a, b) (a + b)
那麼如果在代碼(除字符串)中任何地方存在的MY_MACRO1
或MY_MACRO2
一提的預處理與在#define
行名稱後無論發生什麼事替換此。
還可以有宏的參數(如SUM)。在這種情況下,預處理器能夠識別的參數,例如:
int x = 1, y = 2;
int z = SUM(x, y);
預處理器替換這樣的:
int x = 1, y = 2;
int z = (x + y);
僅此更換後的編譯器得到編譯生成的代碼。
「宏定義」僅指示它們是如何指定的(使用#define指令),而「宏」是定義的函數或表達式。
但是,除了語義之外,它們之間幾乎沒有什麼區別。
感謝您的回覆。關於「#定義SUM(a,b)(a + b)」,我們應該總是包括a + b之間的+ b嗎?謝謝。 – Simplicity 2011-01-22 09:32:19
@SWEngineer在這種情況下,它不會使用圓括號,但考慮以下代碼:int z = SUM(a,b)* 3;如果SUM沒有括號定義,則會擴展爲int z = a + b * 3 ;`,那可能不是你想要的。 – Fiktik 2011-01-22 09:38:34