保留标识符或保留宏名称不能使用#define和#undef。
我在此代码中违反了此规则
"#define _POSIX_C_SOURCE 200809L". _POSIX_C_SOURCE是宏的保留标识符。
这段代码的正式偏差是什么?
发布于 2020-05-13 01:37:43
是的,没错,这里违反了规则21.1。
规则21.1文本中的一点规定,不应使用以和下划线开头的标识符或宏名称。
发布于 2020-05-13 16:49:41
这不仅仅是MISRA违规,也是标准C违规。例如,请参阅C11 7.1.3:
其中“保留供任何使用”是指为编译器/库实现保留的。
问题出在标识符的Glibc命名上。如果实现保证了这个标识符,那么您应该能够使用它。
但这里有一个问题:让Glibc MISRA兼容是不可能的任务。专业的MISRA-C实现不允许使用不兼容的库。
如果您仍然坚持使用这些库,则必须为整个标准库创建一些大规模的、项目范围内的偏差。这里的问题是,大量的Glibc代码依赖于gcc的非标准扩展,比如编写在库实现之外行为定义不佳的代码-为了编写不适用普通C规则的标准库。从MISRA-C的角度来看,您不可能认为这样的代码是可信的。
我会问在同一个项目中将POSIX、Glibc和MISRA-C组合在一起的人,从这里开始该如何进行……
https://stackoverflow.com/questions/61757167
复制相似问题