创建私有枚举值

时间:2014-09-02 18:00:36

标签: c forward

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
 };

我的编译器不允许我这样做,那么还有另一种解决方法吗?我想这是不可能的:我是否需要依赖我的头文件始终不变的事实?

1 个答案:

答案 0 :(得分:2)

对于enum,您所描述的内容是不可能的,因为它违反了enum。对于你想要的,你应该只使用外部链接来做变量。

头文件:

extern const int debug_debug, debug_info,...;

实施档案:

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

为了增加安全性,您可以使用GCC的属性语法__attribute__((section("rodata")))将变量放在只读内存中。