我正在尝试编写一个接受我的枚举常量的按位组合的函数。
typedef enum {
one = 1 << 0,
two = 1 << 1,
three = 1 << 2
} num;
void myFunc(num nums) {
printf("%x", nums);
}
这个想法是我的函数参数有一点类型检查(尽管没有强制执行)。
使用以下任何一个可以愉快地调用myFuncmyFunc(one);
myFunc(two | three);
myFunc(3);
基本上,nums参数类型不强制执行任何操作。 (虽然我确实得到了“与其他类型混合的枚举类型”警告)
所以我的问题是,执行这种按位组合参数的c标准方法是什么?有什么方法可以让编译器理解我想要的nums吗?
不幸的是,搜索这个主题只会让我得到c#解决方案(flagsattribute)。事后看来,'c'可能不是一个很好的名字选择。
由于这个编译,我宁愿这样做,而不是myFunc(int nums);
,它不会给编译器或程序员任何指示它期望枚举的组合。
创建第二个枚举,它包含所有nums组合,看起来有点过分。
答案 0 :(得分:1)
使用标准C无法实现您的目标。根据C99,任何类型为枚举的实际上都是int类型 - 两者之间没有区别。枚举的目的几乎只是向其他程序员提供你的意图的一种方式。
参考:http://c0x.coding-guidelines.com/6.4.4.3.html
如果gcc给你发出警告你可以使用-Werror
标志,那么缺点是你的所有警告都会被归类为错误。
答案 1 :(得分:0)
如前所述,在C中没有编译时方法。 但是,您可以(并且应该)向myFunc()添加运行时检查以确保输入可以接受。