解除引用类型
我有一个枚举
enum AgentStatus { kSTOPPED = 0, kRUNNING, kIDLE, kNAGENTSTATUS };
Run Code Online (Sandbox Code Playgroud)
我需要将它传递给具有许多重载变体的外部库的函数.我想把它传递给第二个参数:
DimService::DimService(const char*, int&);
DimService::DimService(const char*, char*);
...
Run Code Online (Sandbox Code Playgroud)
如果我对我的枚举变量进行转换(int&),我会得到臭名昭着的警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
如果我对(int)进行强制转换,我会得到这个
invalid conversion from ‘int’ to ‘char*’
error: initializing argument 2 of ‘DimService::DimService(const char*, char*)’
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
如果您在使用内联强制转换时出现问题,将其拆分为单独的行可能会有所帮助:
const AgentStatus enumValue = kRUNNING;
...
int intValue = static_cast<int>(enumValue);
DimService("works now", intValue);
Run Code Online (Sandbox Code Playgroud)
小智 6
比尔的答案在技术上是正确的答案.
1)另一种方法
如果你需要摆脱类型的枚举,另一种方法是将类型设置为int本身.
typedef int MyEnum;
enum
{
CONST1 = 0,
etc...
};
Run Code Online (Sandbox Code Playgroud)
然后就像平时一样使用它.编译器不会捕获错误的值赋值,但由于您可以将所有声明标记为MyEnum类型,因此它应该足够简单以跟踪发生的情况,并且您可以将变量传递到它所说的int的任何位置.
2)危险的方法
千万不要这样做!
EnumType v = EnumValue_...
MyFunction( *((int*)&v) );
Run Code Online (Sandbox Code Playgroud)
或这个...
#define MAKE_INT_REF(v) *((int*)&(v))
MyFunction( MAKE_INT_REF(v) );
Run Code Online (Sandbox Code Playgroud)
原因是编译器可以自动选择用于枚举的类型.它可能会选择int或者它可能会选择char.您无法确定不同的编译器和平台.因此,如果你尝试转换枚举,你将得到不可移植的代码和非常危险的代码,因为写回这样的强制转换可以覆盖其他值.