定义的宏'__CCP_H__'保留给编译器[MISRA 2012规则21.1,必需]

kap*_*dit 4 c misra

我对此Misra警告有两个用例,如下所述。编译器是否为#if定义保留了某些名称或特定名称而不能使用?

目前,我已禁用此警告,//lint !e9071但是我们真的需要对此类警告采取任何措施吗?如果我们禁用此类警告,将会有任何影响或风险吗?

情况1:

#ifndef __CCPPAR_H__
#define __CCPPAR_H__    //lint !e9071


#include "Ccp_Cfg.h"

#endif /* multiple inclusion protection - __CCPPAR_H__ */
Run Code Online (Sandbox Code Playgroud)

观察到的警告:

defined macro '__CCPPAR_H__' is reserved to the compiler [MISRA 2012
Rule 21.1, required]
Run Code Online (Sandbox Code Playgroud)

情况2:

#ifndef __CCP_H__
#define __CCP_H__    //lint !e9071

#include "Ccppar.h"

#define MAJOR   0x02
#define MINOR   0x01

/* other parts of code */ 

#endif
Run Code Online (Sandbox Code Playgroud)

观察到以下Misra警告:

defined macro '__CCP_H__' is reserved to the compiler [MISRA 2012
Rule 21.1, required]
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 7

C标准(更不用说MISRA)保留以双下划线开头的所有令牌。

运行的实际风险是使用该符号或什至是编译器本身的C标准库实现,这与您的代码冲突。

部分C11§7.1.3保留标识符说:

  • 以下划线,大写字母或另一个下划线开头的所有标识符始终保留供任何使用。
  • 在普通和标记名称空间中,所有以下划线开头的标识符始终保留为具有文件范围的标识符。

另请参阅C 中的双下划线(__const)是什么意思?

  • 为了进一步阐明,像这样错误地命名包含保护宏的做法似乎来自仅查看标准库头文件的功能并将其复制。错了 标准库头是实现的一部分,并且不仅可以而且必须在保留的名称空间中使用宏,因为它们不能使用为应用程序保留的任何内容。该应用程序(包括不属于标准库的任何第三方库源)必须不要使用这些保留的名称,而应选择与其他应用程序代码不太可能冲突的东西。 (3认同)
  • @kapilddit:这是*唯一*的解决方案! (2认同)