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

带有C枚举的scanf()

发布时间:2020-12-16 09:29:07 所属栏目:百科 来源:网络整理
导读:以下是我们的代码库中的典型情况. enum ConfigOption { CONFIG_1=1,CONFIG_2=2,CONFIG_3=3 }ConfigOption cfg1,cfg2;sscanf(s,"%d",cfg1); 这是一个内部使用的仿真软件.没有分发.易于维护和正确性非常重要.可移植性和用户界面 – 不是真的. 问题是c中的枚举
以下是我们的代码库中的典型情况.

enum ConfigOption { CONFIG_1=1,CONFIG_2=2,CONFIG_3=3 }

ConfigOption cfg1,cfg2;

sscanf(s,"%d",&cfg1);

这是一个内部使用的仿真软件.没有分发.易于维护和正确性非常重要.可移植性和用户界面 – 不是真的.

问题是c中的枚举不一定是int.因此,我们会收到编译器警告,并且在使用其他编译器或启用优化时可能会出现错误行为.

一种解决方案就是将& cfg转换为int *.但是,这不会捕获编译器决定在枚举中分配int以外的东西的情况.

所以我提出了以下解决方案:

template<typename T> inline
int& eint(T& enum_var) {
    assert(sizeof(T) == sizeof(int));
    return (int&)enum_var;
}

现在使用scanf如下:

sscanf(s,&eint(cfg1));

我很想听听上述问题的意见和其他(更好的)解决方案.
请记住,其中一个目标是保持代码简单.这不是“生产质量”的东西,你添加的越多 – 维护就越困难.

解决方法

如果你有像vs2010这样的现代编译器,你可以指定枚举元素的大小

enum class ConfigOption: unsigned int {CONFIG_1=1,CONFIG_3=3};

它在C 0x中的新功能

(编辑:李大同)

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

    推荐文章
      热点阅读