# include <stdio.h>
# define ONE 1
# define TWO 2
# define ONE TWO
# define TWO ONE
int main (void)
{
printf("ONE = %d, TWO = %d\n", ONE, TWO);
return 0;
}
當我們這樣寫時,究竟發生了什麼?在第四行#define ONE TWO
中,預處理器是否立即將其替換爲1 2
?宏代換
# include <stdio.h>
# define ONE 1
# define TWO 2
# define ONE TWO
# define TWO ONE
int main (void)
{
printf("ONE = %d, TWO = %d\n", ONE, TWO);
return 0;
}
當我們這樣寫時,究竟發生了什麼?在第四行#define ONE TWO
中,預處理器是否立即將其替換爲1 2
?宏代換
如果您正在使用的Xcode 3,你可以做的文件點擊右鍵並選擇預處理
你會得到一個巨大的文件與接近尾聲
int main (void)
{
printf("ONE = %d, TWO = %d\n", ONE, TWO);
return 0;
}
編輯的代碼:在這種情況下,我發現它毫無用處。出於某種原因,預處理過程沒有發生錯誤和警告,但代碼不會改變。但是,如果您編寫有用的代碼,您可以查看預處理的代碼。
如果你嘗試編譯它,你會得到一堆警告和錯誤。
test.c:4:1: warning: "ONE" redefined
test.c:2:1: warning: this is the location of the previous definition
test.c:5:1: warning: "TWO" redefined
test.c:3:1: warning: this is the location of the previous definition
test.c: In function ‘main’:
test.c:8: error: ‘ONE’ undeclared (first use in this function)
test.c:8: error: (Each undeclared identifier is reported only once
test.c:8: error: for each function it appears in.)
test.c:8: error: ‘TWO’ undeclared (first use in this function)
是的,這就是我得到的......但我真正想知道的是,預處理器如何解釋它? – phoenix 2011-03-26 09:10:58
它不解釋它,因爲它是一個錯誤。我猜這就是爲什麼來自預處理的代碼與輸入完全相同的原因。 – 2011-03-26 09:14:13
其中將調用哪個宏的衝突.....因爲ONE是1且ONE是TWO ....即鏈接錯誤。
上面的評論是好的,如果你正在使用turbo c編譯器... – dexter 2011-03-26 12:41:22
宏被預處理器替換 - 鏈接不進入圖片。 – 2012-01-07 19:54:48
在第4行
#define ONE TWO
,預處理器是否立即將其替換爲1 2
?
號在這種情況下,define
指令的相關形式是:
#define
標識符替換列表換行
...並沒有替換髮生在identifier
。此外,以下適用:
目前定義爲類對象宏的標識符不應由另一
#define
預處理指令重新定義,除非第二定義是類似對象的宏定義和兩個替換列表是相同的。
...這使您的重新定義非法。
如果您需要重新定義一個宏,您必須首先使用#undef
取消定義它。
它會拋出多個錯誤和警告...... – phoenix 2011-03-26 09:04:29
@phoenix:恭喜,您剛剛回答了您自己的問題。 – 2011-03-26 09:05:31
嘗試一下:http://codepad.org/SmyKNvLm – quasiverse 2011-03-26 09:05:59