为什么MISRA规则禁止使用'#undef'?

时间:2012-07-26 08:11:36

标签: c misra

为什么MISRA规则禁止在程序中使用#undef?如果我想限制任何宏的范围,如何在不使用#undef

的情况下执行此操作

3 个答案:

答案 0 :(得分:7)

基本上,因为MISRA过于偏执,并且不相信程序员知道他们在做什么:-)严重的是,MISRA试图防止某些错误,并且相信如果你禁止可能存在问题的代码结构,可靠性软件突然增加。这是否属实是一个有争议的问题。在#undef的情况下,可能的原因是一旦定义了宏,它的扩展就会保持不变,而且总是来自它的定义。如果允许#undef,则标识符可以作为变量,函数名,typedef或struct / union成员重用,甚至可以作为带有gasp,不同扩展的宏重用。如果愿意的话,这是防止标识符阴影的一些方法。可怕,不是吗?!你决定了!

要回答第二个问题,如果#undef无法使用,限制宏范围的唯一方法是使用文件结束,这是唯一的其他标准定义方式结束宏的范围。换句话说,您必须将源文件拆分为较小的文件,并仅在编译需要它的特定文件时定义宏。

答案 1 :(得分:5)

MISRA对于禁止使用#undef的原因有自己的解释:

  通常不需要#undef。当在代码中使用宏时,它的使用可能导致对宏的存在或含义的混淆。

答案 2 :(得分:2)

回复上面@ Bubble的评论:

  

请你举一个例子。我无法想象它怎么可能   制造混乱?

想象一下场景......

#define MACRO some-definition
.
.
MACRO // Invovation 1
.
.
MACRO // Invocation 2
.
.

然后有人出现并插入现有的MACRO调用

之间
.
.
#undef MACRO
#define MACRO something-else
MACRO // Between (1) and (2)
.
.

最初的MACRO第二次调用不会达到预期效果!