2015-05-06 143 views
-1

我對C編程中的宏有個疑問。我對宏的瞭解是,它們是預處理器指令,在編譯階段完成之後就被刪除了。所以我寫了一段代碼來測試這一點,但它的編譯階段後仍然有效:C預處理器宏

#define SWAP(x,y) {int temp; temp = *x;*x = *y;*y=temp;} 

int main() 
{ 
     int data1, data2; 
     while((scanf("%d%d",&data1,&data2)) == 2) 
     { 
      SWAP(&data1,&data2); 
      printf("Data1 =%d, data2 = %d\n",data1,data2); 
     } 
} 

我不知道爲什麼這段代碼仍然有效。

+2

你是什麼意思*它仍然在編譯階段後*? –

回答

0

宏在編譯時間後不會被刪除。當處理器運行時(編譯之前的步驟),它找到所有發生的SWAP並用它們的定義替換,在這種情況下,所有的代碼都被擴展和編譯而不會出現任何問題。

1

因爲宏做了它應該做的事情。 預處理拿着線

SWAP(&data1,&data2); 

{int temp; temp = *data1;*data1 = *data2;*data2=temp;}; 

取代它再喂的是編譯器,它做它的工作,你的程序工作。

宏是在編譯之前發生的TEXTUAL替換。

+0

非常感謝你解釋很多:) – Max