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

有帮助吗?

解决方案

基本上,因为MISRA过于偏执,不相信程序员知道他们在做什么:-)严重的是,MISRA试图防止某些错误,并以这样一种信念为指导,即如果您禁止潜在有问题的代码构这是否属实是一个有争议的问题。的情况下 #undef, ,可能的原因是,一旦定义了宏,它的扩展就会保持不变,并且总是从它的定义开始。如果你允许 #undef, ,标识符可以作为变量,函数名,typedef或struct/union成员重用,甚至可以作为带有a,gasp的宏, 不同的 扩张。这是防止标识符阴影的某种方法,如果你愿意的话。吓人,不是吗?!你决定吧!

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

其他提示

米斯拉对为什么使用 #undef 被禁止:

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

回复@Bubble上面的评论:

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

想象一下这个场景。..

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

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

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

最初的第二次调用宏不会做你所期望的!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top