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

标签 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 的组合似乎有点矫枉过正。

最佳答案

标准 C 无法实现您尝试执行的操作。根据 C99,枚举类型的任何内容实际上都是 int 类型 - 两者之间没有区别。枚举的目的几乎只是向其他程序员展示您的意图的一种方式。

引用:http://c0x.coding-guidelines.com/6.4.4.3.html

如果 gcc 给你警告,你可以使用 -Werror 标志,缺点是在这种情况下你所有的警告都将被归类为错误。

关于c 枚举类型的按位组合参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692590/

相关文章:

c - 在打印之前对 C 中的整数列表进行排序

c - 什么是 C 中的结构的清晰、简单的解释

c - 在 C 中带有对角星号图案的正方形

java - 具有多个参数的 DirContext 搜索数组

javascript - 将参数从 JavaScript 函数传递到 JSP

c++ - C++ 函数中的复杂参数 - 指针、引用或...?

c# - 如何在 .NET 类库中创建 "abstract"枚举?

c# - 将泛型 T 转换为 System.Enum

java - 比较枚举时简化测试

arrays - 为什么在 char 数组的字符之间插入 "\000"个字符?