7

为什么 MISRA 规则禁止#undef在程序中使用?如果我想限制任何宏的范围,如何在不使用的情况下做到这一点#undef

4

3 回答 3

10

基本上,因为 MISRA 太偏执,不相信程序员知道他们在做什么 :-) 认真地说,MISRA 试图防止某些错误,并以这样一种信念为指导,即如果你禁止潜在有问题的代码结构,软件的可靠性会突然增加. 这是否属实还有待商榷。在 的情况下#undef,可能的原因是,一旦定义了宏,它的扩展就会保持不变,并且始终是其定义中的扩展。如果你允许#undef,标识符可以作为变量、函数名、typedef 或 struct/union 成员重用,甚至可以作为具有不同扩展的宏。如果您愿意,这是一种防止标识符隐藏的方法。可怕,不是吗?!你决定!

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

于 2012-07-26T08:17:30.227 回答
5

#undefMISRA 对禁止使用的原因有自己的解释:

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

于 2012-07-26T08:41:00.823 回答
2

回复@Bubble 上面的评论:

要求你举个例子。我无法想象它怎么会造成混乱?

想象一下场景...

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

然后有人出现并插入,在现有的 MACRO 调用之间

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

MACRO 的原始第二次调用不会达到您的预期!

于 2012-08-21T13:19:55.577 回答