为什么 MISRA 规则禁止#undef
在程序中使用?如果我想限制任何宏的范围,如何在不使用的情况下做到这一点#undef
?
问问题
1932 次
3 回答
10
基本上,因为 MISRA 太偏执,不相信程序员知道他们在做什么 :-) 认真地说,MISRA 试图防止某些错误,并以这样一种信念为指导,即如果你禁止潜在有问题的代码结构,软件的可靠性会突然增加. 这是否属实还有待商榷。在 的情况下#undef
,可能的原因是,一旦定义了宏,它的扩展就会保持不变,并且始终是其定义中的扩展。如果你允许#undef
,标识符可以作为变量、函数名、typedef 或 struct/union 成员重用,甚至可以作为具有不同扩展的宏。如果您愿意,这是一种防止标识符隐藏的方法。可怕,不是吗?!你决定!
#undef
要回答您的第二个问题,如果不能使用,限制宏范围的唯一方法是使用文件结尾,这是结束宏范围的唯一其他标准定义方法。换句话说,您必须将源文件拆分为更小的源文件,并且仅在编译需要的特定文件时才定义宏。
于 2012-07-26T08:17:30.227 回答
5
#undef
MISRA 对禁止使用的原因有自己的解释:
#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 回答