【发布时间】:2018-09-27 08:01:57
【问题描述】:
可以说,在许多情况下,X 宏可以提高安全性,因为它可以更轻松地确保生成的数组具有相同的长度。
但是,Misra C(来自 2004 年参考)规则似乎有很多限制使用的预处理器规则:
规则 19.1(建议)文件中的#include 语句只能在其他预处理器指令之前 或 cmets。
如果源表在其他文件中,例如生成数组,则会出现问题。但这是建议性规则,因此可以解决。
规则 19.4(必需)C 宏只能扩展为花括号初始值设定项、常量、字符串文字、 带括号的表达式、类型限定符、存储类说明符或 do-while-zero 构造。
应该不是问题,因为大多数 X 宏都用于生成数组初始值设定项或常量。
规则 19.6(必需)#undef 不得使用。
使某些 X 宏使用模式成为不可能。不幸的是,但并没有完全阻止 X 宏。
规则 19.7(建议)应优先使用函数而不是类似函数的宏。
仅限咨询规则。
规则 19.12(必需)在单个预处理器中最多出现一次 # 或 ## 预处理器运算符 宏定义。
可以使用嵌套宏来解决。
规则 19.13(建议)不应使用 # 和 ## 预处理器运算符。
例如,在生成枚举时很麻烦,但这只是建议性规则。
Rule 19.15 (required) 应采取预防措施以防止包含头文件的内容 两次。
在某些情况下很麻烦,但可以解决。
看上面的内容,如果你小心的话,似乎可以将 X-macros 与 Misra C 代码一起使用。
我的结论是正确的,还是我遗漏了一些规则?
【问题讨论】:
-
19.4 的意思是立即展开还是通过另一个宏展开也可以接受?那可能不是首发。
-
@StoryTeller 好点。我以为它列出了所有预处理后的最终结果,但我不确定。