为什么MISRA规则禁止使用'#undef'?

bub*_*ble 7 c misra

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

Jen*_*ens 9

基本上,因为MISRA过于偏执,并且不相信程序员知道他们在做什么:-)说真的,MISRA试图防止某些错误,并且相信如果你禁止潜在有问题的代码结构,软件的可靠性突然增加.这是否属实是一个有争议的问题.在这种情况下#undef,可能的原因是,一旦定义了一个宏,它的扩展就会保持不变,而且总是来自它的定义.如果允许#undef,标识符可以作为变量,函数名,typedef或struct/union成员重用,甚至可以作为带有gasp,不同扩展的宏重用.如果愿意的话,这是防止标识符阴影的一些方法.可怕,不是吗?!你决定!

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

  • 有人被迫使用(一部分)MISRA,我可以全心全意地同意.如果一些无知的管理机构迫使所有的MISRA规则被遵守,我会倾向于让天堂和地狱运动,让他们明白为什么这是一个坏主意.一种方法是要求进行科学研究,表明MISRA可以防止由于围绕其规则实施扭曲的方式而产生的更多错误. (4认同)
  • "这是否属实是一个有争议的问题":这是一种委婉说法.这种类型的bullcrap倾向于驱使优秀的程序员远离项目(因为他们经常可以选择去其他地方工作),并降低代码质量. (3认同)
  • 无论如何,我认为即将推出的 MISRA 标准将会好得多,因为他们在没有适当理由的情况下淘汰了许多规则,或者将它们降级为咨询。我个人对 MISRA 的看法是,你应该带着怀疑的态度来阅读它,并基于它制定你自己的编码标准。我为我的公司设计了这样一个编码标准,删除了 3-4 个奇怪的 MISRA 规则,并添加了一些 MISRA 中没有的东西,最明显的是针对类似函数的宏、全局变量和其他类似的东西的更严格的规则。 (3认同)
  • 有人阅读并为 StackOverflow 做出贡献的事实已经使他们与*大多数*开发人员区别开来。有大量朝九晚五的人只是让他们的代码“工作”。许多开发人员甚至从未听说过“促销”,更不用说了解它的规则了。就个人而言,我觉得如果您知道为什么存在规则并且通过“违反”该规则更好地解决方案,那么更好的代码应该获胜。不过,这是一个难题,因为我的汽车收音机没问题,但刹车系统不一定没问题。 (2认同)
  • @Jens MISRA-C 很大程度上基于科学研究,主要是计算机科学家 Les Hatton 和 Andrew Koenig 的研究和书籍(尽管他们都不在 MISRA 委员会中)。然而,我不相信他们中的任何一个人提到#undef,这个特定的规则可能缺乏理由。 (2认同)

oua*_*uah 5

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

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