c枚举类型的按位组合参数

时间:2014-09-05 19:19:31

标签: c parameters enums bit-manipulation

我正在尝试编写一个接受我的枚举常量的按位组合的函数。

typedef enum {
    one = 1 << 0,
    two = 1 << 1,
    three = 1 << 2
} num;

void myFunc(num nums) {
    printf("%x", nums);
}

这个想法是我的函数参数有一点类型检查(尽管没有强制执行)。

使用以下任何一个

可以愉快地调用myFunc
myFunc(one);
myFunc(two | three);
myFunc(3);

基本上,nums参数类型不强制执行任何操作。 (虽然我确实得到了“与其他类型混合的枚举类型”警告)

所以我的问题是,执行这种按位组合参数的c标准方法是什么?有什么方法可以让编译器理解我想要的nums吗?

不幸的是,搜索这个主题只会让我得到c#解决方案(flagsattribute)。事后看来,'c'可能不是一个很好的名字选择。

由于这个编译,我宁愿这样做,而不是myFunc(int nums);,它不会给编译器或程序员任何指示它期望枚举的组合。

创建第二个枚举,它包含所有nums组合,看起来有点过分。

2 个答案:

答案 0 :(得分:1)

使用标准C无法实现您的目标。根据C99,任何类型为枚举的实际上都是int类型 - 两者之间没有区别。枚举的目的几乎只是向其他程序员提供你的意图的一种方式。

参考:http://c0x.coding-guidelines.com/6.4.4.3.html

如果gcc给你发出警告你可以使用-Werror标志,那么缺点是你的所有警告都会被归类为错误。

答案 1 :(得分:0)

如前所述,在C中没有编译时方法。 但是,您可以(并且应该)向myFunc()添加运行时检查以确保输入可以接受。