我要在文件中使用以下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宏只能扩展为支撑的初始化程序,常量, 字符串文字,带括号的表达式,类型限定符, 存储类说明符或“零时执行”构造。
答案 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?)。