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 作为变量类型的调试器友好性质(它分解为手表中的组件位标志等)?
还要考虑可能有数百个这样的标志枚举,以及数千个使用点。理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是有效的;我想到的应用程序是受计算限制的,并且以速度快着称。
澄清:我正在将一个大型(>300K)C 程序翻译成 C++,所以我正在寻找运行时和开发时的有效翻译。简单地在所有适当的位置插入石膏可能需要数周时间。