MISRA C 2012中的规则21.1指出:
#define 和 #undef 不得用于保留标识符或保留宏名称
此规则适用于以下划线开头的标识符或宏
理由:
删除或更改保留宏的含义可能会导致 未定义的巴哈维奥尔
我不明白为什么宏的名称不能以 unerscore 开头,即使它不是保留的宏?例如在我的头文件中:
#ifndef __MY_HEADER_
#define __MY_HEADER_
或在我正在使用的库中:
#define __I volatile const
我应该更改我的所有代码和我正在使用的库(这是一个大库(以符合此规则还是有更简单的解决方案?
根据 C 标准(第 7.1.3 节(,所有以_[A_Z]
或__
开头的标识符都是保留的。由于它们是保留的,常识和规则 21 禁止您修改(重新定义或取消定义(它们(或创建自己的(。
因此,您应该将代码更改为不使用前导下划线,即使在包含保护中也是如此,更不用说您的宏了。
可以找到一些进一步的阅读,例如:在 C 语言中包含保护约定