代码之家  ›  专栏  ›  技术社区  ›  Barry Kelly

C BITFLAG枚举应该如何翻译成C++?

  •  3
  • Barry Kelly  · 技术社区  · 16 年前

    C++主要是C的超集,但并不总是如此。特别地,虽然C和C++中的枚举值隐式转换为int,但反过来却不是真的:只有在C do INT中转换回枚举值。因此,通过枚举声明定义的位标志不能正常工作。因此,这在C中是可以的,但是在C++中是不行的。

    typedef enum Foo
    {
        Foo_First = 1<<0,
        Foo_Second = 1<<1,
    } Foo;
    
    int main(void)
    {
        Foo x = Foo_First | Foo_Second; // error in C++
        return 0;
    }
    

    如何有效和正确地处理这个问题,理想情况下不损害使用foo作为变量类型(它分解成手表中的组件位标志等)的调试器友好性质?

    还要考虑到可能有数百个这样的标志枚举,以及数千个使用点。理想情况下,某种有效的运算符重载可以实现这一点,但它确实应该是有效的;我所想到的应用程序是计算绑定的,并且以速度快著称。

    说明:我正在把一个大的(.gt;3000)C程序翻译成C++,所以我在运行时和开发时都在寻找一个高效的翻译。仅仅在所有合适的位置插入铸件可能需要几周时间。

    3 回复  |  直到 16 年前
        1
  •  8
  •   Ferruccio bayda    16 年前

    为什么不把结果扔回比赛场地呢?

    Foo x = Foo(Foo_First | Foo_Second);
    

    编辑:当我第一次回答这个问题时,我不理解你的问题的范围。上面的内容可以用来做一些局部修复。对于要执行的操作,需要定义一个运算符,该运算符接受2个foo参数并返回foo:

    Foo operator|(Foo a, Foo b)
    {
        return Foo(int(a) | int(b));
    }
    

    int类型转换是为了防止不需要的递归。

        2
  •  2
  •   Mike G.    16 年前

    这听起来像是一个适用于强制转换的理想应用程序——这取决于您告诉编译器,是的,您的意思是用一个随机整数实例化一个foo。

    当然,从技术上讲,foo-first foo-second不是foo的有效值。

        3
  •  0
  •   ejgottl    16 年前

    将结果保留为int或static\u cast:

    Foo x = static_cast<Foo>(Foo_First | Foo_Second); // not an error in C++