2012-03-21 21 views
0

我宣佈一個枚舉這樣的:如何從與prepocessor枚舉值記錄到文件中

typedef enum message_t { 
    mes_no_error = 0, // no message sent 
    mes_internal = 1, // reserved for internals 
    mes_start  = 2, // when main() is executed 
    mes_init  = 3, // when inits in main() are done 
    mes_end   = 4, // when main() returns 
    mes_foo, 
    mes_bar, 
    mes_joe 
} message; 

由於這是它跟我在PC上的微控制器,我想知道的值被用於mes_foo,mes_bar,mes_joe ....

我以爲我可以使用編譯器指令類似:

#warning "mes_block_01 = " mes_joe 

後來發球,正則表達式和轉儲值到文件編譯編程的,是當米然而,海灣合作委員會告訴我:

message.h:63:2: Warnung: #warning "mes_block_01 = " mes_joe 

沒有值,但只有枚舉名稱。

是否有可能從枚舉自動分配的值記錄到文件?是否可以用預處理器或編譯時顯示常量/定義的值?

+1

沒有答案,但你爲什麼要這樣做?未指定的值將根據一些標準規則設置,我認爲'mes_foo'-> 5等,另一個問題可以回答這個問題。如果你依靠他們具有特定的價值觀,爲什麼你不把它們設置? – 2012-03-21 10:34:55

+0

枚舉成員作爲從微控制器發送到PC的(int)消息的名稱。有一個GUI應用程序向我顯示所有消息(在GtkTreeStore中)。由於消息的編號不易於人讀取,因此我想顯示在枚舉中使用的名稱。我有一個用於uC-> PC通信的啞數據協議,並且這些消息應該靈活且易於更改。因此,我希望在編譯期間將枚舉值轉儲到某處並將它們動態地包含在GUI中。任何想法? – user1283043 2012-03-21 17:34:40

+1

您是否正在研究X宏等http://drdobbs.com/blogs/cpp/228700289? – 2012-03-21 20:24:46

回答

1

K&R

A.8.4枚舉

...

在枚舉列表中的標識符聲明爲 int類型的常量,並可能出現的地方常量是必需的。如果沒有 與=的枚舉出現,則對應的 常量的值將從0開始,並隨着從 從左到右讀取聲明而增加1。具有=的枚舉器給出指定的值的關聯標識符 ; 隨後標識符繼續進展 從分配的值

所以mes_foo=5mes_bar=6mes_joe=7。在編譯時你不需要做任何事情來了解這些值。他們的價值是固定的。

0

請參閱Pavan關於枚舉行爲的答案。

因爲他們的行爲就像你不應該只是初始化一些枚舉成員。初始化全部或無。否則,像這樣編寫代碼時,你可能會得到意外的錯誤:

typedef enum 
{ 
    BLUE=2, 
    BLACK, 
    WHITE=3, 
    YELLOW=7 
} Color_t; 

Color_t color = BLACK; 

if(color == WHITE) 
{ 
    printf("White"); // will get executed with color == BLACK 
} 

因爲像這樣的錯誤,書寫halfways初始化像這樣枚舉由MISRA-C禁止:2004年,9.3。

0

@honk做到了。他認識到我需要枚舉值和人類可讀名稱之間的語義連接,易於通過GUI應用程序進行維護和解析。我會,但

#define MESSAGES \ 
    X(MES_NO_ERROR, 0) \ 
    X(MES_INTERNAL, 1) \ 
    X(MES_START, 2) 

到messages.h然後將郵件模塊中只是做

#define X(a, b) b, 
enum messages_t { MESSAGES }; 
#undef X 

謝謝!