C++ 将枚举传递给引用int的函数
去引用类型双关 我有一个枚举C++ 将枚举传递给引用int的函数,c++,casting,enums,C++,Casting,Enums,去引用类型双关 我有一个枚举 enum AgentStatus { kSTOPPED = 0, kRUNNING, kIDLE, kNAGENTSTATUS }; 我需要将它传递给具有许多重载变量的外部库的函数。我想把它传递给第二个参数: DimService::DimService(const char*, int&); DimService::DimService(const char*, char*); ... 如果我对enum变量的(int&)进行强制转换,就会得到臭名昭著的
enum AgentStatus { kSTOPPED = 0, kRUNNING, kIDLE, kNAGENTSTATUS };
我需要将它传递给具有许多重载变量的外部库的函数。我想把它传递给第二个参数:
DimService::DimService(const char*, int&);
DimService::DimService(const char*, char*);
...
如果我对enum变量的(int&)进行强制转换,就会得到臭名昭著的警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules
如果我对(int)进行转换,我会得到这个
invalid conversion from ‘int’ to ‘char*’
error: initializing argument 2 of ‘DimService::DimService(const char*, char*)’
正确的方法是什么 当您在在线播放中遇到问题时,可以将其作为单独的一行进行分解:
const AgentStatus enumValue = kRUNNING;
...
int intValue = static_cast<int>(enumValue);
DimService("works now", intValue);
const AgentStatus enumValue=kRUNNING;
...
int intValue=静态_转换(枚举值);
DimService(“立即工作”,intValue);
比尔的回答在技术上是正确的
1) 另一种方法
如果需要消除类型的枚举性,另一种方法是将类型本身设置为int
typedef int MyEnum;
enum
{
CONST1 = 0,
etc...
};
然后像平常一样使用它。编译器不会捕获错误的值赋值,但由于您可以将所有声明标记为MyEnum类型,因此它应该足够简单,可以跟踪正在发生的事情,并且您可以将变量传递到显示int的任何位置
2) 危险方法
永远不要这样做
EnumType v = EnumValue_...
MyFunction( *((int*)&v) );
或者这个
#define MAKE_INT_REF(v) *((int*)&(v))
MyFunction( MAKE_INT_REF(v) );
原因是编译器可以自动选择用于枚举的类型。它可以选择int或char。您不能跨不同的编译器和平台确定。因此,如果您尝试强制转换枚举,您将得到不可移植的代码和非常危险的代码,因为回写此类强制转换可能会覆盖其他值。若要使用int变量,而不是强制转换为引用,请不要强制转换
enum AgentStatus:int{…
?将添加为_lvalue
?请注意,您正在定义一个具有返回类型的构造函数:即illegal@AndyProwl我假设DimService是一个名称空间,它与“我需要将它传递给具有许多重载变量的外部库的函数”这句话相匹配很好。请小心:在C++98中,枚举必须有足够大的值来支持。上面只有4个值的枚举可以由char
支持,如果编译器希望这样做的话。是的。仔细想想,这是一个非常糟糕的主意。现在删除该部分。我选择将枚举类型转换为int如1)所示,这也是我所做的。但您应该注意这种方法。当您有一些枚举值只需要存储为字节而不需要作为byref值时,请在typedef中使用无符号字符类型。如果枚举值存储在变量或参数中,则这并不重要,但对于具有实例的nds一般使用int,然后使用typedef类型的字段不是一个好主意,因为它将使用比需要更多的内存。使用enum类(C++11)可以指定底层数据类型。这样,选项2)是可行的enum类水果:int{Apple,Banana,Cherry}
难道没有其他方法不需要将intValue
赋值回enumValue
?因为枚举可以使用任何足够大的基础类型,所以不能可靠地将其用作引用参数。假设枚举有4个项,因此编译器决定在内部使用char
。您会如何使用然后取一个char&
并将其转换为函数参数的int&
?如果我显式定义enum
的底层类型,这也是一种不好的做法吗?我还不知道这与enum类
如何交互。