首页 > 解决方案 > 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))))

请让我知道是否有替代解决方案。

标签: cmisra

解决方案


使用静态内联函数而不是宏。(无论如何,MISRA 建议不要使用“宏函数”,请参阅这个 SO question,所以无论如何你都应该这样做。)一旦它是一个内联函数,你可以键入x无符号以避免大量转换以及> 0u问题。


推荐阅读