[英]Redefine value from enum
我在正在使用的第3方庫中定義了以下代碼:
typedef enum {
STATE_INITIAL = 0,
STATE_LOAD = 1,
STATE_READ = 2,
STATE_FINISH = 3
} state_t;
我想重新定義STATE_FINISH的值。 但是,我不想弄亂該庫,同時我也不能在我的代碼中這樣做:
#undef STATE_FINISH
#define STATE_FINISH 2
還有另一種方法嗎?
首先,# #undef
將不會起作用。 這僅適用於#define
d的名稱。 因此,您應該將其忽略。
其次, #define STATE_FINISH 2
可能會產生您似乎想要的效果。 但是,您必須確保在標頭為#include
d的所有情況下始終使用它。 否則,程序中用於STATE_FINISH的值將不一致。 另外,您必須在#include
之后執行#define
。 如果您之前做過,它將已經在頭文件中進行替換,這會將enum
定義更改為錯誤的
typedef enum {
STATE_INITIAL = 0,
STATE_LOAD = 1,
STATE_READ = 2,
2 = 3 /* or STATE_READ = 3, for the other variant; also wrong */
} state_t;
現在結合有關訂單的這些警告:您將無法獲得保證的權利。 如果在#include
之后重新定義#define
,則可能是頭文件中的某些代碼已使用STATE_FINISH
,而這些代碼將不會被替換。 根據您的需要,這可能是錯誤的。
接下來,您確定要執行此操作嗎? 為什么? 而且,您可能不是用#define STATE_FINISH STATE_READ
代替嗎? 差異似乎很細微,但在於表達您的真實意思。
也許您的意思更像是#define MY_OWN_STATE STATE_READ
? 如果為州使用自己的發明名稱,那么對STATE_FINISH
的真實含義的混淆會更少。 它還表達了一個事實,即您無法更改庫中使用的STATE_FINISH
的值(當然,我希望您已經意識到了這一點)。
如果你敢說
#define STATE_FINISH 2
無需#unefine任何內容,因為typedef不是預處理程序命令。 現在,您的預處理程序定義將用2替換所有出現的STATE_FINISH,以便實際的編譯器永遠不會看到該標識符。
這是否有意義是另一個問題。
更新:我無法確定,但是當枚舉由不同的整數類型(例如,字符)表示時,可能會出現一些細微的問題。 C沒有重載的函數,盡管這是C ++中最明顯的問題(並且獨立於基礎類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.