MISRA C 2012 - 规则 21.1 - 以下划线开头的宏

Posted

技术标签:

【中文标题】MISRA C 2012 - 规则 21.1 - 以下划线开头的宏【英文标题】:MISRA C 2012 - Rule 21.1 - Macros starting with underscore 【发布时间】:2018-06-05 09:32:47 【问题描述】:

MISRA C 2012 中的规则 21.1 规定

#define 和 #undef 不得用于保留标识符或保留宏名称

此规则适用于以下划线开头的标识符或宏

理由

删除或更改保留宏的含义可能会导致 未定义的行为

我不明白为什么宏的名称不能以非字符开头,即使它不是保留的宏?例如在我的头文件中:

#ifndef __MY_HEADER_
#define __MY_HEADER_

或在我正在使用的库中:

#define __I volatile const

我应该更改我的所有代码和我正在使用的库(这是一个大库)以符合此规则还是有更简单的解决方案?

【问题讨论】:

even if it is not a reserved macro?可以用于其他实现,甚至可以用于此实现的其他版本。 好的。那么我该如何解决呢?很难在所有库模块中更改“__I”! 用户代码不应使用前导下划线;它们是为实现和库保留的。所以你应该只更改你自己的代码,从#define _xyz ... 中删除所有前导下划线并且不要更改库标题。这些是由应该知道自己在做什么的人制作的。 9您当然可以引用库头文件中的宏,但永远不要(重新)定义它们) 下划线命名是 C 标准要求,而不是 MISRA 要求。 【参考方案1】:

根据 C 标准(第 7.1.3 节),所有_[A_Z]__ 开头的标识符都是保留的。由于它们是保留的,因此常识和规则 21 禁止您修改(重新定义或取消定义)它们(或创建您自己的)。

因此,您应该将代码更改为使用前导下划线,即使在包含守卫中也不要提及您的宏。

可以找到一些进一步的阅读,例如这里:Include guard conventions in C

【讨论】:

以上是关于MISRA C 2012 - 规则 21.1 - 以下划线开头的宏的主要内容,如果未能解决你的问题,请参考以下文章

MISRA C ++(规则18-4-1)和动态内存分配 - 是否允许使用std :: string?

C中的MISRA增量

MISRA C:2012 8 Rules 8.1 A Standard C environment

MISRA C:2004,移位错误

要构建以提供给 cppcheck MISRA 附加组件的正确规则文件是啥?

Misra 2012 背后的基本原理不允许在不同指针之间进行转换