MISRA C 2012 - 规则 21.1 - 以下划线开头的宏
MISRA C 2012 - Rule 21.1 - Macros starting with underscore
MISRA C 2012 中的规则 21.1 指出
#define and #undef shall not be used on a reserved identifier or reserved macro name
This rule applies to identifier or macro beginning with an underscore
Rationale:
Removing or changing the meaning of a reserved macro may result in
undefined bahaviour
我不明白为什么宏的名称不能以下划线开头,即使它不是保留宏?例如在我的头文件中:
#ifndef __MY_HEADER_
#define __MY_HEADER_
或在我正在使用的图书馆中:
#define __I volatile const
我应该更改所有代码和我正在使用的库(这是一个大库)以符合此规则还是有更简单的解决方案?
根据C标准(第7.1.3节),所有以_[A_Z]
或__
开头的标识符被保留。由于它们是保留的,常识和规则 21 禁止您修改(重新定义或取消定义)它们(或创建您自己的)。
因此,您应该将您的代码更改为 而不是 使用前导下划线,即使在 include guards 更不用说您的宏了。
可以找到一些进一步的阅读,例如这里:Include guard conventions in C
MISRA C 2012 中的规则 21.1 指出
#define and #undef shall not be used on a reserved identifier or reserved macro name
This rule applies to identifier or macro beginning with an underscore
Rationale:
Removing or changing the meaning of a reserved macro may result in undefined bahaviour
我不明白为什么宏的名称不能以下划线开头,即使它不是保留宏?例如在我的头文件中:
#ifndef __MY_HEADER_
#define __MY_HEADER_
或在我正在使用的图书馆中:
#define __I volatile const
我应该更改所有代码和我正在使用的库(这是一个大库)以符合此规则还是有更简单的解决方案?
根据C标准(第7.1.3节),所有以_[A_Z]
或__
开头的标识符被保留。由于它们是保留的,常识和规则 21 禁止您修改(重新定义或取消定义)它们(或创建您自己的)。
因此,您应该将您的代码更改为 而不是 使用前导下划线,即使在 include guards 更不用说您的宏了。
可以找到一些进一步的阅读,例如这里:Include guard conventions in C