7

可以说,在许多情况下,X 宏会增加安全性,因为它可以更容易地确保生成的数组的长度相同。


但是,Misra C(来自 2004 参考)规则似乎有很多限制使用的预处理器规则:

规则 19.1(建议)文件中的#include 语句只能在其他预处理器指令或注释之前。

例如,如果源表在包含以生成数组的其他文件中,则很麻烦。但这是建议性规则,因此可以解决。

规则 19.4(必需)C 宏只能扩展为花括号初始值设定项、常量、字符串文字、带括号的表达式、类型限定符、存储类说明符或 do-while-zero 构造。

应该不是问题,因为大多数 X 宏都用于生成数组初始值设定项或常量。

规则 19.6(必需)不得使用#undef。

使某些 X 宏使用模式成为不可能。不幸的是,但并没有完全阻止 X 宏。

规则 19.7(建议) 应优先使用函数而不是类似函数的宏。

仅限咨询规则。

规则 19.12(必需) 在单个宏定义中最多应出现一次 # 或 ## 预处理器运算符。

可以使用嵌套宏来解决。

规则 19.13(建议) 不应使用 # 和 ## 预处理器运算符。

例如,在生成枚举时很麻烦,但这只是建议性规则。

规则 19.15(必需) 应采取预防措施以防止头文件的内容被包含两次。

在某些情况下很麻烦,但可以解决。


看了上面的内容,如果你小心的话,似乎可以将 X-macros 与 Misra C 代码一起使用。

我的结论是正确的,还是我缺少一些规则?

4

2 回答 2

6

在我看来,使用 X 宏来增加类型安全性是一个相当薄弱的论点。他们做的主要事情是简化维护并消除代码重复问题。但就像任何类似函数的宏一样,当其他一切都失败时,它们是最后的手段。

确保数组具有正确长度等的正确方法是使用static_assert产生编译时错误的(或一些 hack:ish pre-C11 机制)。

一次解决一个问题:

  • 文件中的 include 语句只能在其他预处理器指令或注释之前。...如果源表在包含的其他文件中,则很麻烦...

    这是一个合理的规则,没有理由偏离它。如果您在另一个文件中有一个源表#include,那么有什么问题?该规则没有提及预处理的头文件。

    该规则的主要原因是防止人们在#include文件中间的某个地方折腾。(这很可能是由一些遗留的调试代码引起的。)

  • 规则 19.4(必需)C 宏只能扩展为花括号初始值设定项、常量、字符串文字、带括号的表达式、类型限定符、存储类说明符或 do-while-zero 构造。

    如果解释为(递归)扩展宏,这应该不是问题,因为 X 宏最终应该归结为常量、类型等。规则说“扩展”,所以我认为它指的是完全扩展的宏。

    此规则已在 MISRA-C:2012 中完全删除,并替换为其他更具体的规则,例如不制作与语言关键字同名的宏等。

  • 规则 19.6(必需)不得使用#undef。

    在 MISRA-C:2012 中,此规则已从要求放宽为建议。反对该规则的一个有效论点确实#undef是 X 宏所必需的,尽管我不能说这是否是它放松的原因。

    大多数情况下,规则是为了防止#undef NULL某些人可能会得到类似代码或其他奇怪和晦涩的想法。

  • 规则 19.7(建议) 应优先使用函数而不是类似函数的宏。

    一般来说,MISRA-C 反对使用类似函数的宏,这是 MISRA-C:2004 和当前 MISRA-C:2012 中的建议规则。并且有很好的理由:我们都知道类似函数的宏通常是邪恶的,但我们也知道它们通常是必要的邪恶。

  • 规则 19.12(必需) 在单个宏定义中最多应出现一次 # 或 ## 预处理器运算符。

    该规则在 MISRA-C:2012 中已放宽为咨询。如果没有这两个,可能很难编写一些 X 宏。有一些与它们相关的有效危险,但其他规则已解决。我在 MISRA-C:2012 中发现与 X 宏没有冲突。

  • 规则 19.15(必需) 应采取预防措施以防止头文件的内容被包含两次。

    强制使用标头保护的合理规则。无论有没有 X 宏,都没有理由偏离它。

结论:
在之前的 MISRA-C:2004 中不能使用 X 宏,但是在当前的 MISRA-C:2012 中可以使用。我强烈建议升级,因为 MISRA-C:2012 是一个更好的重大变化。各种迂腐的规则已被删除、放宽或重写。诸如有关隐式类型提升的复杂规则已得到显着改进。现在有 C99 支持。等等。

我自己在 MISRA-C:2012 中使用了 X-macros,据我所知,没有必要偏离任何必要的规则。

于 2018-09-27T09:50:33.697 回答
0

请记住,MISRA-C:2004 是一套指南……它甚至为您提供了一个流程,以防您想做一些指南规定不做的事情。

看了上面的内容,如果你小心的话,似乎可以将 X-macros 与 Misra C 代码一起使用。

是的...您可以提出偏差 - 这需要您了解您决定违反指南的后果,证明违反的合理性,并获得适当的批准。

在这种情况下,偏离。

于 2018-09-28T10:55:25.050 回答