【发布时间】:2018-11-23 13:49:08
【问题描述】:
我有一小段 C 代码的奇怪行为。 我想将布尔表达式的结果存储在变量中,但它似乎不起作用。
按照代码:
#define rtCP_Constant_Value_fklq (uint8_t) 1 //Simulink const
#define rtCP_Constant_Value (uint8_t) 0 //Simulink const
uint16_t rtb_tobit;
volatile unsigned char rtb_y;
uint8_t asr_ena_=14;
rtb_tobit = (1 << rtCP_Constant_Value_fklq);
uint8_t temp = ((uint8_t)rtb_tobit) & asr_ena_;
rtb_y = (temp !=(rtCP_Constant_Value));
我已经在 Nucleo 评估板上使用两个编译器 Renesas SH 9_4_1 和 gcc-arm non-eabi 测试了这段代码。
在它们中,变量rtb_y 始终为零。
调试器显示表达式(temp !=(rtCP_Constant_Value)) 为真,但我不明白为什么,变量rtb_y 始终等于0。
有人能解释一下为什么吗?这种奇怪的行为是因为我使用了 C 标准吗?
【问题讨论】:
-
如果您在构建时启用更多警告(至少添加
-Wall和-Wextra标志,可能是-pedantic),编译器不会报错? -
我不知道这些板子,但
volatile变量被允许以实现定义的方式改变它的值:有可能在这个平台上,设置它似乎 i> 什么都不做,因为它可以立即将自己变回零(也许它检测到它已设置并执行其他操作作为中断?)。 -
@Someprogrammerdude 我会试试你的建议。
-
@Leushenko 我不使用中断,我只使用 volatile 来避免优化。
-
从
#defines 中删除;。示例#define rtCP_Constant_Value_fklq ((uint8_t) 1)。 xmaze,这对你有用吗?