我正在尝试编写一个函数来接受我的枚举常量的按位组合。
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 的组合似乎有点矫枉过正。
最佳答案
标准 C 无法实现您尝试执行的操作。根据 C99,枚举类型的任何内容实际上都是 int 类型 - 两者之间没有区别。枚举的目的几乎只是向其他程序员展示您的意图的一种方式。
引用:http://c0x.coding-guidelines.com/6.4.4.3.html
如果 gcc 给你警告,你可以使用 -Werror
标志,缺点是在这种情况下你所有的警告都将被归类为错误。
关于c 枚举类型的按位组合参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692590/