2014-09-02 50 views
-1

C你可以枚舉這樣的:讓私人枚舉值

enum { 
    key_1 = 1, 
    key_2 = 2, 
    key_3 = 4 
}; 

,我發現,當你把這個在公衆頭,你不能保證在價值觀問題預編譯的實現與公共頭部匹配。例如:

enum lvls { 
    debuglvl_debug  = 0x01 
    debuglvl_info  = 0x02, 
    debuglvl_warning  = 0x04, 
    debuglvl_error  = 0x08, 
    /* And so on... */ 
    debuglvl_all   = 0xFF 
}; 

如果你現在會做這在你的代碼(私人):

if (flags & debuglvl_error) { 
    /* Do something when debuglvl_error flag is set */ 
} 

沒有保證debuglvl_error將具有價值0x08,因爲它可以在頭部很容易地改變文件(當然,如果你想改變這些值,現在它是值得懷疑的,但我只是想要討厭)。所以..有辦法讓枚舉值私有?事情是這樣的:

公頭文件:

enum lvls { 
     debuglvl_debug, 
     debuglvl_info, 
     debuglvl_warning, 
     debuglvl_error, 
     debuglvl_all 
}; 

私有實現:

enum lvls { 
    debuglvl_debug  = 0x01 
    debuglvl_info  = 0x02, 
    debuglvl_warning  = 0x04, 
    debuglvl_error  = 0x08, 
    debuglvl_all   = 0xFF 
}; 

我的編譯器不會讓我這樣做,所以是有另一種解決方法呢?我想這是不可能的:我需要依靠我的頭文件始終不變的事實嗎?

+2

爲什麼有人想通過更改標題來打破它?或者,這是一個關於版本控制的問題,其中某人擁有不同版本的頭文件? – 2014-09-02 18:06:28

+0

是關於版本控制和外部更改(無論出於何種原因)。 – d3L 2014-09-02 18:08:12

回答

2

你所描述的不可能是enum,因爲它與enum不符。對於你想要的,你應該只使用外部鏈接來做變量。

頭文件:

extern const int debug_debug, debug_info,...; 

實現文件:

const int debug_debug = 0x01, debug_info = 0x02,...; 

和用於增加安全性,您可以使用GCC的屬性語法__attribute__((section("rodata")))放置在只讀存儲器中的變量。