MISRA 19.4的说明

时间:2018-07-17 12:19:24

标签: c misra

我要在文件中使用以下MACRO

#define DO_WAKEUP_SYNCHRONISIEREN proc.id = process_WAKEUP;proc.priority.level = PRIO_AKTIV_1;proc.priority.param=0u;(void)prio_mapF_put_in_matrix(proc)

我知道这违反了MISRA-C:2004规则19.4-但我需要使用它并解决违规。

我可以使用MACRO来解决MISRA-C违规问题吗?

MISRA-C:2004年第19.4条是

  

C宏只能扩展为支撑的初始化程序,常量,   字符串文字,带括号的表达式,类型限定符,   存储类说明符或“零时执行”构造。

1 个答案:

答案 0 :(得分:5)

看起来规则是:

#define B A
  

在此规则下,以上内容不是宏定义的允许形式,因为A不是常量,加括号的初始化程序,带括号的表达式,类型限定符,存储类说明符或 do-while-zero构造 < / p>

#define B (A)
  

以上内容是允许的。替换列表是带括号的表达式。

对此进行扩展(即使没有MISRA约束,我也会这样做,但我只是注意到该规则指出了这一点:“做时为零的构造”,恕我直言,乍一看,“做-而零结构”则表示您不知道该内容时...):

#define DO_WAKEUP_SYNCHRONISIEREN do {proc.id = process_WAKEUP;proc.priority.level = PRIO_AKTIV_1;proc.priority.param=0u;(void)prio_mapF_put_in_matrix(proc);} while(0)

所以指令块不能被这样的结构“部分调用”:

if (flag) DO_WAKEUP_SYNCHRONISIEREN;

这会让试图理解该错误的人感到头疼。

同时,它强制添加一个;而不是一个简单的{}块。因此,该宏看起来非常像一个函数调用(另请参见Why use do { } while (0) in macro definition?)。