代码之家  ›  专栏  ›  技术社区  ›  Ankit Shah

MISRA 19.4澄清

  •  -1
  • Ankit Shah  · 技术社区  · 6 年前

    我想在我的文件中使用以下宏

    #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-但我需要使用它来解决这一违反。

    有什么方法可以使用宏并解决misra-c冲突吗?

    MISRA-C:2004规则19.4是

    C宏只能扩展到有支撑的初始化器,常量, 一个字符串文本、一个带括号的表达式、一个类型限定符、一个 存储类说明符,或Do While零构造。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Jean-François Fabre    6 年前

    规则是:

    #define B A
    

    在该规则下,上述不是允许的宏定义形式,因为a不是常量、有支撑的初始值设定项、带括号表达式、类型限定符、存储类说明符或 零构造时执行

    #define B (A)
    

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

    这是一个扩展(即使没有misra约束,我也会这样做,但我注意到规则规定:“do while zero construction”,imho当你不知道这一点时,“do while zero construction”的含义并不明显…):

    #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? )