關於在enum中使用 define的意義

2021-09-29 23:43:53 字數 993 閱讀 8192

real source:

attention: 列舉型別定義時預設從0開始,如果沒有定義值的話,然後依次遞增。位於中間的話,則值為前乙個列舉值+1,如果沒有定義值的話。

以下一段**來自於linux中的pthread.h

enum

;一直想不明白此處將#define放入enum有何意義?在進行一遍預處理後,也沒看出此處的#define有何用處。哪位有心得,講講!

8樓 發表於 2006-07-20 21:11 | 只看該作者

以前的版本中 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

;

PHP中使用hidef擴充套件代替define提高效能

需要新加乙個常量,開啟了本地的config.php檔案,想到了幾年前測試過的hidef以及apc提公升define效能的方案。我的程式中有對開發 測試 生產伺服器分別做了不同的配置,在常量方面則使用了乙個陣列定義了所有需要定義的常量,然後檢測是否有apc load constants函式,沒有的話,...

hibernate中使用enum型別

1.在pojo 實體類中定義了乙個customer 類和乙個枚舉子類partner.class customer class enum partner 在寫入資料庫的時候,可以選擇寫入int 型別或者string 型別.這個取決於配置.下面的配置是寫入字串到資料庫中 import j ax.pers...

關於VIVADO在Ubuntu中使用遇到的問題

20190820今天在測試中的sdk的時候,開啟sdk介面出現這個錯誤 the configuration area at home usr xilinx sdk 2017.4 could not be created.please choose a writeable location using...