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

Sal*_*din 2 c lint misra

MISRA C 2012 中的规则 21.1 规定

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

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

理由

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

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

#ifndef __MY_HEADER_
#define __MY_HEADER_
Run Code Online (Sandbox Code Playgroud)

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

#define __I volatile const
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*iev 6

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

因此,您应该将代码更改为使用前导下划线,即使在包含防护中也是如此,更不用说您的宏了。

可以在此处找到一些进一步的阅读:Inclusion Guard conventions in C