在enum中的巨集定義

2021-06-04 04:48:53 字數 1199 閱讀 5328

**:

今天在**裡看到有一點很奇怪的**,**定義了乙個列舉型別,但是這個列舉型別沒有變數名,而且在其中包含了巨集定義,巨集定義也是自己定義自己

enum ;

然後搜到了以下的解釋:

enum

;

以前的版本中 pthread_cancel_enable 和 pthread_cancel_disable 都是定義為以下巨集的形式:

#define pthread_cancel_enable           0x00

#define pthread_cancel_disable 0x01

由於巨集屬於編譯預處理,不屬於語言本身,所以在編譯預處理階段只是進行簡單的字串替換,不進行語法檢查;巨集在使用上還有一些固有的缺陷需要特別注意;巨集名也不會增添到目標檔案的符號列表中,因而不利於程式的除錯,等等。

以上種種,在現代的 c 或者 c++ 語言中應該盡量避免使用巨集、而是用 const、enum 或 inline (指對函式而言)等來代替,這已經是人們的共識。

這種**反映的就是由原來的巨集定義修改為列舉(enum)定義後的情況。由於 pthread_cancel_enable 和 pthread_cancel_disable 原來是巨集定義,因此使用者也可能把它們當作條件編譯中的條件來使用,如:

#ifdef pthread_cancel_enable

/* ... */

#endif

所以,pthread_cancel_enable 和 pthread_cancel_disable 作為巨集定義最好應該還存在,但是它們卻不能再分別代表 0 和 1 了(否則編譯預處理後就被替換為 0 或 1 ,這樣作為列舉常量的它們實際上就沒有用武之地了),因此就在enum的定義中夾雜出現了如下「奇怪」的巨集定義:

enum

;

這樣定義的巨集實現的是自己替換自己的功能,所以對於以後出現的 pthread_cancel_enable 或 pthread_cancel_disable 實際上沒有任何影響,但是卻使 pthread_cancel_enable 和 pthread_cancel_disable 兩個巨集有了定義,可以作為條件編譯中的條件來使用。這樣就將因程式修改(將巨集用enum代替)而帶來的影響降到了最低,是一種幾乎完全的替代方案。

關於 在巨集定義中的用法

在c c 的巨集定義中,存在特殊的作用1.運算子將乙個巨集的引數轉換為字串字面量。它僅允許出現在帶引數的巨集的替換列表中。view plain copy to clipboard print?include define print str s printf s s n s int main 輸出 ...

在C 中定義VMprotect巨集

定義虛擬機器保護的巨集 define vmprotectbegin asm emit 0xeb asm emit 0x10 asm emit 0x56 asm emit 0x4d asm emit 0x50 asm emit 0x72 asm emit 0x6f asm emit 0x74 asm ...

在結構體中定義巨集定義意義

第一次看見在結構體中有巨集定義,開始有點迷糊,想到該結構是如何儲存的?巨集定義會是不會多次編譯?以下是我看的乙個列子 typedef struct define xcp authorized bit 0x01 uint16 t xcpauthorizedbit 1 define block resp...