c - 使用 stringify 运算符 '#' MISRA Rule 20.10 (MISRA C :2012) . 实现 stringify 宏的替代方法是什么

标签 c misra

MISRA 标准不允许在宏定义中使用字符串化运算符 在不使用 # 运算符的情况下实现相同概念的替代方法是什么?

最佳答案

实际上并没有任何直接的替代方案——只有变通办法。此建议规则与建议不要使用类似函数的宏的建议指令 4.9 具有相同的性质。

一个人可以(而且可能必须)偏离这些规则/指令,但关键是这样做必须是一个明智的选择。我们应该尽量减少使用这些宏,并且只将它们用作最后​​的手段。您需要激励为什么使用特定的类似函数的宏或字符串化使代码更安全

并且不仅仅是一些反对代码重复的模糊论据——代码重复的治疗永远不应该比它试图治愈的疾病更糟糕。例如,即使在普通的 C 项目中,通过发明一些特定于项目的宏语言来试图变得“聪明”也是完全 Not Acceptable - 因此自然也不应该在关键任务项目中这样做。

另一方面,诸如寄存器映射定义等的东西通常是用类似函数的宏来实现的,这也是偏离的原因。还有更复杂的情况也可能需要偏差,只要你能证明它是合理的。

关于c - 使用 stringify 运算符 '#' MISRA Rule 20.10 (MISRA C :2012) . 实现 stringify 宏的替代方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71109404/

相关文章:

c - 什么时候应该在 C 语言中使用 UINT32_C()、INT32_C()... 宏?

c++ - 由于无符号算术运算符的环绕而导致的 MISRA 错误

c++ - 函数不应在 block 范围内声明

c - 即使没有分配足够的内存,strcat() 和 strcpy() 也能工作

c - 在 Linux 中使用 stat & tm structor 获取文件时间

C 结构变量访问

c - 按位逻辑帧

c - 使用像指针一样的全局数组,C

c++ - ./lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a 的用法是什么

c - 需要对 MISRA 规则 13.6 进行解释