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?
MISRA C:2012 8 Rules 8.1 A Standard C environment