在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
};
我的编译器不允许我这样做,那么还有另一种解决方法吗?我想这是不可能的:我是否需要依赖我的头文件始终不变的事实?
答案 0 :(得分:2)
对于enum
,您所描述的内容是不可能的,因为它违反了enum
。对于你想要的,你应该只使用外部链接来做变量。
头文件:
extern const int debug_debug, debug_info,...;
实施档案:
const int debug_debug = 0x01, debug_info = 0x02,...;
为了增加安全性,您可以使用GCC的属性语法__attribute__((section("rodata")))
将变量放在只读内存中。