C:将按位AND的结果分配给bool
我在C中有以下循环,用g 4.1.2编译:
while(1) { int status = getStatus(); bool firstOk = status & 0x1; bool secondOk = status & 0x2; if(firstOk != m_firstOk) { logStatus(1,firstOk); m_firstOk = firstOk; } if(secondOk != m_secondOk) { logStatus(2,secondOk); m_secondOk = secondOk; } sleep(1); } 注意logStatus()按值接收其参数,因此不修改参数. m_firstOk和m_secondOk当然是bool成员属性. 到目前为止一切正常.我收到一份报告说它没有检测到firstOk何时更改.我用gdb附加了运行进程.它在sleep()行中,当我看到以下内容时我感到惊讶: (gdb) p m_firstOk $1 = true (gdb) p m_secondOk $2 = true (gdb) p firstOk $3 = 244 WTF?当它应该是按位AND与0x1的结果时,firstOk怎么能是244?我知道布尔值实际上存储为整数,但是我的按位AND怎么可能被忽略?因为它是244,所以当它应该是假的时候它被评估为真,这是问题的原因. 是不是将按位AND的结果赋给布尔值安全?这是一个gcc bug吗?或者我应该做以下的事情? bool firstOk = (status & 0x1) ? true : false; 提前致谢. 解决方法
当你到达sleep()调用时,局部变量fi??rstOk和secondOk不是“活动的”,所以即使它们已经被分配了堆栈槽,它们的值也不再存储在任何地方是完全可能的(而且很可能).
如果需要调试这些变量中的任何一个,则需要 >将它们重新声明为静态,这将从堆栈中分配持久存储 在任何情况下,一旦完成调试过程,我将恢复上述任何调试措施. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |