簡體   English   中英

從枚舉重新定義值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM