[英]MISRA C 2012 21.1
#define
和#undef
不得用于保留的标识符或保留的宏名称。
我违反了此代码的此规则
"#define _POSIX_C_SOURCE 200809L".
_POSIX_C_SOURCE
是宏的保留标识符。
此代码的正式偏差是什么?
是的,没错,这里违反了规则 21.1。
规则 21.1 文本中的一点指出,不应使用以下划线开头的标识符或宏名称。
该规则的基本原理是在标准库头文件中使用以下划线开头的宏定义。
这不仅是 MISRA 违规,而且也是标准 C 违规。 参见例如 C11 7.1.3:
- 以下划线和大写字母或另一个下划线开头的所有标识符始终保留用于任何用途。
其中“保留用于任何用途”是指为编译器/库实现保留。
问题在于标识符的 Glibc 命名。 如果实现支持此标识符,那么您应该能够使用它。
但这里有个问题:让 Glibc MISRA 兼容是不可能完成的任务。 并且专业的 MISRA-C 实现不允许使用不兼容的库。
如果您仍然坚持使用这些库,则必须为整个标准库创建一些大规模的、项目范围的偏差。 这里的问题是,大量的 Glibc 代码依赖于 gcc 非标准扩展,例如编写否则在库实现之外具有不良定义行为的代码 - 为了编写标准库,其中正常的 C 规则不不适用。 从 MISRA-C 的角度来看,您不可能提出这样的代码值得信任的论点。
我会问打电话在同一个项目中结合 POSIX、Glibc 和 MISRA-C 的人如何从这里继续......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.