2011-07-26 102 views
5

我發現了一些東西在C頭文件我無法弄清楚是什麼。例如在文件bits/socket.h中有一個枚舉類型enum __socket_type,但是在每個枚舉器之後都有一個定義宏,它定義了相同的宏。例如:用#define重新定義枚舉子

enum __socket_type 
{ 
    SOCK_STREAM = 1, 
    #define SOCK_STREAM SOCK_STREAM 
    ... 
}; 

我一直無法知道這是什麼。請賜教。我甚至不知道如何爲查詢谷歌和本網站搜索框形成正確的問題。

回答

4

預處理器宏將永遠不會遞歸地擴展,所以這樣一個#define所做的就是在使用它的地方留下名稱。當您想要進行預處理器功能測試時,這種功能非常有用。

#ifdef SOCK_STREAM 
.. 
#endif 

可以用來有條件地編譯一些代碼。

編輯:因此,它將枚舉的更簡潔的方法(沒有碰撞和範圍的隱式值)與預處理器測試相結合。

+0

確實,這是有道理的,但爲什麼還有枚舉不僅定義? – BeginEnd

+0

@BeginEnd,請看我的編輯 –

+0

我擔心你會說這個。 :P做這種「普遍」的事情往往會讓我的編程生活變得更艱難...... – BeginEnd

5

我能想到的唯一的事情是因爲人們看到全大寫的常量,說NUM_FILES,他們會認爲這是一個宏都禁不住這樣寫:通常

#ifdef NUM_FILES 

現在,這將失敗,但是如果您編寫#define NUM_FILES NUM_FILES,它將作爲預處理器和IDE的宏以及代碼本身的枚舉。

0

我會懷疑是IDE或其他工具瞭解符號是以某種方式定義的。