c - C 中 2 的幂的 Misra 兼容宏
问题描述
我有以下宏
#define POWER_OF_TW0(x) ( ((x) > 0) && (!((x)&((x) - 1))))
为了使其符合misra,我尝试了
#define POWER_OF_TW0(x) ( ((x) > 0) && (!((unsigned)(x)&((unsigned)(x) - 1u))))
但这仍然不符合misra,因为如果代码如下
uint8_t val = 4;
if(POWER_OF_TWO(val))
{
..
}
misra 工具将抱怨 unsigned number 与有符号数字 0 相比((x) > 0)
。
如果 val 的声明已签署,那将很高兴int8_t
。
我觉得唯一的出路是考虑这个宏将被赋予正数并将代码更改为((x) != 0u)
ie;
#define POWER_OF_TW0(x) ( ((x) != 0u) && (!((unsigned)(x)&((unsigned)(x) - 1u))))
请让我知道是否有替代解决方案。
解决方案
使用静态内联函数而不是宏。(无论如何,MISRA 建议不要使用“宏函数”,请参阅这个 SO question,所以无论如何你都应该这样做。)一旦它是一个内联函数,你可以键入x
无符号以避免大量转换以及> 0u
问题。
推荐阅读
- haskell - 通过 Barbies-TH 将 Barbie 类型用作另一个 Barbie 类型中的字段
- node.js - Mongoose:未调用 ID 时路径“_id”处的 CastError
- r - 如何将整列附加到 r 中另一列的末尾?
- python - Python gnupg“类型错误:需要一个类似字节的对象,而不是'str'”
- google-chrome - chrome.runtime.onMessage.addListener 在页面加载之前不起作用
- jmeter - Jmeter - 分布式(远程)测试执行从连接在执行过程中关闭
- javascript - 使用 router.get('/me', (res,req) => {}) 时如何访问身份验证信息
- javascript - 如何使用 javascript 减少实时日期/时间字符串?
- python - 使用 Python 从网页抓取到动态表
- javascript - 在这种情况下如何优化我的变量?