gpt4 book ai didi

c++ - C 位标志枚举应如何转换为 C++?

转载 作者:太空狗 更新时间:2023-10-29 19:55:55 25 4
gpt4 key购买 nike

C++ 主要是 C 的超集,但并非总是如此。特别是,虽然 C 和 C++ 中的枚举值都隐式转换为 int,但反之则不然:只有在 C 中,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 作为变量类型的调试器友好性质(它分解成 watch 中的组件位标志等)?

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

澄清:我正在将大型 (>300K) C 程序翻译成 C++,因此我正在寻找在运行时和开发人员时都有效的翻译。简单地将铸件插入所有适当的位置可能需要数周时间。

最佳答案

为什么不直接将结果转换回 Foo?

Foo x = Foo(Foo_First | Foo_Second);

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

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

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

关于c++ - C 位标志枚举应如何转换为 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/199606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com