【问题标题】:MISRA C 2012 - Rule 21.1 - Macros starting with underscoreMISRA C 2012 - 规则 21.1 - 以下划线开头的宏
【发布时间】: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 要求。

标签: c lint misra


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多