2011-05-03 157 views
2

有没有办法在C中创建多个枚举的组合? 我想有一个共同的枚举,将用于其他枚举。枚举的组合

例如,我想写入以下代码:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1 
} 

enum first_e { 
    common_e, // <- Somehow I would like to have the two common_e's literals here 
    FIRST_LITERAL_0, 
} 

enum another_e { 
    common_e, // <- Somehow I would like to have the two common_e's literals here 
    ANOTHER_LITERAL_0, 
    ANOTHER_LITERAL_1 
} 

我担心的是保持共同文字在子enumarations相同的顺序,因为它们被用作ID为函数指针阵列。

有没有解决方案来做到这一点?

回答

4

事情是这样的:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    COMMON_MAX 
} 

enum first_e { 
    FIRST_LITERAL_0 = COMMON_MAX, 
} 

enum another_e { 
    ANOTHER_LITERAL_0 = COMMON_MAX, 
    ANOTHER_LITERAL_1 
} 
6

enum s没有命名空间,所以你不能有两个同名的枚举器。所以不,你不能这样做,即使有预处理器或其他魔法。

如果您只是想枚举值进行,其中一个共同的不放过,那么怎么样:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    COMMON_LITERAL_END__ 
}; 

enum first_e { 
    FIRST_LITERAL_0 = COMMON_LITERAL_END__, 
    FIRST_LITERAL_1 
}; 
+0

噢!你已经知道了,我认为这就是我需要的。谢谢 – greydet 2011-05-03 22:37:16

0

这下是不可能的你只需要定义多个枚举。

2

好了,你可以可以想象做这样的事:

#define COMMON_E(N) N##_COMMON_LITERAL_0, \ 
        N##_COMMON_LITERAL_1 

enum first_e { 
    COMMON_E(FIRST), // <- Somehow I would like to have the two common_e's literals here 
    FIRST_LITERAL_0, 
}; 

enum another_e { 
    COMMON_E(ANOTHER), // <- Somehow I would like to have the two common_e's literals here 
    ANOTHER_LITERAL_0, 
    ANOTHER_LITERAL_1 
}; 

虽然我不知道这样做的好处是什么?

问题是,枚举不命名空间,所以你必须提供不同的名称(因此是宏参数)。

+0

这是一个有趣的解决方案。我会在我的应用程序中考虑它,谢谢! – greydet 2011-05-03 22:31:38

0

你不能这样做正是你问什么,但你可以做一些事情,是几乎一样好。每种解决方案都依赖于设置特定枚举成员的值的能力。

你可以把你所有的名字在一个单一的枚举:

enum every_e { 
    // common values 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    MAX_COMMON_LITERAL = COMMON_LITERAL_1, 

    // First set of extra values 
    FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    FIRST_LITERAL_1, 
    FIRST_LITERAL_2, 

    // Second set of extra values 
    ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    ANOTHER_LITERAL_1 
}; 

如果你想使用不同的枚举类型,你可以使用同样的伎俩:

enum common_e { 
    COMMON_LITERAL_0, 
    COMMON_LITERAL_1, 
    MAX_COMMON_LITERAL = COMMON_LITERAL_1 
}; 

enum first_e { 
    FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1, 
}; 

enum another_e { 
    ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1, 
    ANOTHER_LITERAL_1 
}; 
+0

不要给'MAX_COMMON_LITERAL'明确的值,以防止每次添加新的'common_e'枚举器时更新它的维护头痛...... – 2011-05-03 22:31:46

+0

谢谢,@Oli。你是对的。但是既然你和@c微笑已经发布了,我不会去改变这个。 – 2011-05-03 22:36:13