基本上,因为MISRA过于偏执,并且不相信程序员知道他们在做什么:-)说真的,MISRA试图防止某些错误,并且相信如果你禁止潜在有问题的代码结构,软件的可靠性突然增加.这是否属实是一个有争议的问题.在这种情况下#undef,可能的原因是,一旦定义了一个宏,它的扩展就会保持不变,而且总是来自它的定义.如果允许#undef,标识符可以作为变量,函数名,typedef或struct/union成员重用,甚至可以作为带有gasp,不同扩展的宏重用.如果愿意的话,这是防止标识符阴影的一些方法.可怕,不是吗?!你决定!
要回答第二个问题,如果#undef不能使用,限制宏范围的唯一方法是使用end-of-file,这是结束宏范围的唯一其他标准定义方式.换句话说,您必须将源文件拆分为较小的文件,并仅在编译需要它的特定文件时定义宏.