当前位置:  开发笔记 > 编程语言 > 正文

如何将C bitflag枚举转换为C++?

如何解决《如何将Cbitflag枚举转换为C++?》经验,为你挑选了1个好方法。

C++主要是C的超集,但并非总是如此.特别是,虽然C和C++中的枚举值都隐式转换为int,但反之则不然:只有在C中,int会转换回枚举值.因此,通过枚举声明定义的bitflags无法正常工作.因此,这在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作为变量类型的调试器友好性质(它会分解为手表中的组件位标志等)?

还要考虑可能有数百个这样的标志枚举,以及数千个使用点.理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是高效的; 我想到的应用程序是受计算限制的,并且具有快速的声誉.

澄清:我正在将一个大型(> 300K)C程序翻译成C++,所以我在运行时和开发人员时间都在寻找有效的翻译.只需在所有适当位置插入演员阵容可能需要数周时间.



1> Ferruccio..:

为什么不把结果反馈给Foo?

Foo x = Foo(Foo_First | Foo_Second);

编辑:当我第一次回答这个问题时,我不明白你问题的范围.以上内容适用于做一些现场修复.对于您想要做的事情,您需要定义一个| 获取2个Foo参数并返回Foo的运算符:

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

int转换是为了防止不希望的递归.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有