Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将枚举传递给引用int的函数_C++_Casting_Enums - Fatal编程技术网

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类
如何交互。