加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将枚举传递给引用int的函数

发布时间:2020-12-16 10:32:55 所属栏目:百科 来源:网络整理
导读:解除引用类型 我有一个枚举 enum AgentStatus { kSTOPPED = 0,kRUNNING,kIDLE,kNAGENTSTATUS }; 我需要将它传递给具有许多重载变体的外部库的函数.我想把它传递给第二个参数: DimService::DimService(const char*,int);DimService::DimService(const char*,
解除引用类型

我有一个枚举

enum AgentStatus { kSTOPPED = 0,kRUNNING,kIDLE,kNAGENTSTATUS };

我需要将它传递给具有许多重载变体的外部库的函数.我想把它传递给第二个参数:

DimService::DimService(const char*,int&);
DimService::DimService(const char*,char*);
...

如果我对我的枚举变量进行转换(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*)’

什么是正确的方法?

解决方法

比尔的答案在技术上是正确的答案.

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.您无法确定不同的编译器和平台.因此,如果你尝试转换枚举,你将得到不可移植的代码和非常危险的代码,因为写回这样的强制转换可以覆盖其他值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读