为什么MISRA规则禁止在程序中使用#undef
?如果我想限制任何宏的范围,如何在不使用#undef
?
答案 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第二次调用不会达到预期效果!