【发布时间】: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 要求。