2011-04-22 65 views
2

今天我剛剛完成了關於如何使用#define創建清單常量的閱讀和試​​驗C,之後出現了一些問題,而下面是代碼。以奇怪的方式使用#define預處理器指令

#include <stdio.h> 
#define dummy main 
#define yam { 
#define apple } 

int dummy(void)  //constant substitution main with dummy 
yam       // constant substitution { with yam 
    printf("It works!!\n"); 
    return 0; 
apple       //constant substitution } with apple 

正如預期的那樣,它的作品般的魅力,我只是想知道爲什麼這樣的事情並沒有引起任何錯誤,也許我可以理解爲什麼main()可以被替換,因爲main是傳遞給函數的標識符(名字,變量和常量),但爲什麼{}也可以用一個符號名稱代替?第二件事是,什麼數據類型C用來存儲這個符號常量,它不是一個字符在單引號""中,也不是一個整數或浮點數。

+2

對於所有神聖的愛,不要以這種可怕的方式濫用預處理器! – Philip 2011-04-22 09:57:04

+1

哈哈@菲利普,我只是感到好奇,所以我做了這個,我不認爲我不會用這種方法編碼任何軟件 – caramel1995 2011-04-22 10:32:49

+0

因此,什麼樣的數據類型文本{和}存儲?因爲我沒有用單引號括起來 – caramel1995 2011-04-22 10:47:05

回答

7

#define語句由程序實際編譯前的預處理程序進行評估,因此編譯器從不會看到yam。預處理器執行直接文本替換。

也就是說,當編譯器看到你的代碼,它看起來像這樣:

int main(void)  //constant substitution main with dummy 
{       // constant substitution { with yam 
    printf("It works!!\n"); 
    return 0; 
}       //constant substitution } with apple 
2

定義是字面上的文本替換。在預處理器步驟中,編譯器將遍歷您的代碼並用mainyam{apple}替換全部dummy

2

這是有效的,因爲預處理器是一個* PRE *處理器,即它是在真實處理之前發生的事情。

因此,預處理器在真正的編譯器查看代碼之前會進行粗略的文本替換。

2

#define由預處理器處理。在編譯器編譯代碼之前,這些東西將被字符替換。你基本上可以使用#define來掩蓋你的整個代碼,但是任何有預編譯器的人都可以在稍後使用它。預處理器替換您定義的「常數」的所有出現,除非用引號引起來(例如char *test="dumy yam apple";將保持不變)。