代码之家  ›  专栏  ›  技术社区  ›  Salahuddin

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

  •  0
  • Salahuddin  · 技术社区  · 7 年前

    Misra C 2012第21.1条规定

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

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

    理论基础 :

    删除或更改保留宏的含义可能会导致 未定义的巴哈维奥

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

    #ifndef __MY_HEADER_
    #define __MY_HEADER_
    

    或者在我正在使用的库中:

    #define __I volatile const
    

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Alexander Dmitriev    7 年前

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

    因此,您应该将代码更改为 即使在include guards中使用前导下划线,更不用说宏了。

    可在此处找到一些进一步的读数: Include guard conventions in C