作者:weneay | 来源:互联网 | 2022-12-10 13:53
我想在我的文件中使用以下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宏只能扩展为支撑的初始化,常量,字符串文字,带括号的表达式,类型限定符,存储类说明符或do-while-zero结构.
Jean-Françoi..
5
看起来规则如下:
#define B A
以上不是此规则下允许的宏定义形式,因为A不是常量,括号初始化器,带括号的表达式,类型限定符,存储类说明符或do-while-zero构造
#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;
这会让任何试图理解这个bug的人头疼.
同时它强制添加一个;
而不是一个简单的{}
块.所以宏看起来非常像一个函数调用(也读取为什么在宏定义中使用do {} while(0)?).
1> Jean-Françoi..:
看起来规则如下:
#define B A
以上不是此规则下允许的宏定义形式,因为A不是常量,括号初始化器,带括号的表达式,类型限定符,存储类说明符或do-while-zero构造
#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;
这会让任何试图理解这个bug的人头疼.
同时它强制添加一个;
而不是一个简单的{}
块.所以宏看起来非常像一个函数调用(也读取为什么在宏定义中使用do {} while(0)?).