2014-09-02 43 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")))放置在只读存储器中的变量。