打印

标准C编译器与单片机C编译器的差别

[复制链接]
3199|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdmgb520|  楼主 | 2011-4-12 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*定义UI 枚举类型*/
typedef enum{top_tm,top_al,top_tr,top_ch} TOP_MODE;
typedef enum{

sec_00=0x00,sec_01,sec_02,sec_03,

sec_10=0x10,sec_11,sec_12,
sec_20=0x20,sec_21,sec_22,sec_23,sec_24,sec_25,sec_26,sec_27,sec_28,sec_29,

sec_30=0x30
//sec_30
表示top_mode 本身
} SEC_MODE;
/*定义系统状态类型*/
typedef struct
{

TOP_MODE _top_mode;

SEC_MODE _sec_mode;
}SYSTEM_STATE;
SYSTEM_STATE _system_state = {top_tm,sec_30};

void Change_State(void)
{
    if (_system_state._sec_mode == sec_30)
//
判断当前模式

{
        if (++_system_state._top_mode == 4)


_system_state._top_mode = 0;

}
}

想要函数实现的功能是:每调用一次函数,系统切换到下一个状态,在四个状态之间循环切换。
Change_State()函数在OKI编译器中可以正常实现该功能,但是放到VS2008 C++环境中,有两个报错:
error C2675: 一元“++”:“TOP_MODE”不定义该运算符或到预定义运算符可接收类型的转换error C2440: “=”: 无法从“int”转换为“TOP_MODE”
转换为枚举类型要求显式转换(static_cast、C 样式转换或函数样式转换)
而同样的代码在IAR EW430 IDE中的报错为:
Warning[Pe188]: enumerated type mixed with another type
但在EW430中仍然能实现该功能。
对于以上的两个错误时没有疑问的,这是标准C规定的。
现在的问题是怎样在标准C中实现这个希望的功能。

-----------------------------------------------------------
纯粹是为了把问题搞清楚,并没有什么实际意义。
谢谢大家参与讨论。

相关帖子

沙发
aihe| | 2011-4-12 23:29 | 只看该作者
C++和标准的C也是有区别的
单片机更是有特别的优化
慢慢琢磨吧

使用特权

评论回复
板凳
免证入网| | 2011-4-13 05:25 | 只看该作者
建议好好看看++运算和枚举。这个运算怎能运用在常量呢?自加后放哪?

使用特权

评论回复
地板
gdmgb520|  楼主 | 2011-4-13 18:28 | 只看该作者
谢谢楼上提醒,搞忘了啊,++操作确实不能对常量进行。

我再看下枚举。

印证了那句话,结果正确,不代表程序正确。

使用特权

评论回复
5
gdmgb520|  楼主 | 2011-4-13 23:17 | 只看该作者
建议好好看看++运算和枚举。这个运算怎能运用在常量呢?自加后放哪?
免证入网 发表于 2011-4-13 05:25


这个说法不对,++_system_state._top_mode 应该是可以的,_system_state._top_mode是结构体变量 _system_state 的成员变量,不是一个常量。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝