2011-03-26 43 views
1
# 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宏代換

+2

它會拋出多個錯誤和警告...... – phoenix 2011-03-26 09:04:29

+3

@phoenix:恭喜,您剛剛回答了您自己的問題。 – 2011-03-26 09:05:31

+0

嘗試一下:http://codepad.org/SmyKNvLm – quasiverse 2011-03-26 09:05:59

回答

1

如果您正在使用的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) 
+0

是的,這就是我得到的......但我真正想知道的是,預處理器如何解釋它? – phoenix 2011-03-26 09:10:58

+0

它不解釋它,因爲它是一個錯誤。我猜這就是爲什麼來自預處理的代碼與輸入完全相同的原因。 – 2011-03-26 09:14:13

0

其中將調用哪個宏的衝突.....因爲ONE是1且ONE是TWO ....即鏈接錯誤。

+0

上面的評論是好的,如果你正在使用turbo c編譯器... – dexter 2011-03-26 12:41:22

+0

宏被預處理器替換 - 鏈接不進入圖片。 – 2012-01-07 19:54:48

0

在第4行#define ONE TWO,預處理器是否立即將其替換爲1 2

號在這種情況下,define指令的相關形式是:

#define標識符替換列表換行

...並沒有替換髮生在identifier。此外,以下適用:

目前定義爲類對象宏的標識符不應由另一#define預處理指令重新定義,除非第二定義是類似對象的宏定義和兩個替換列表是相同的。

...這使您的重新定義非法。

如果您需要重新定義一個宏,您必須首先使用#undef取消定義它。