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

标签 c misra

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

目前,我已通过 //lint !e9071 禁用此警告,但我们真的需要为此类警告做任何事情吗?如果我们禁用此类警告,是否会有任何影响或风险?

案例一:

#ifndef __CCPPAR_H__
#define __CCPPAR_H__    //lint !e9071


#include "Ccp_Cfg.h"

#endif /* multiple inclusion protection - __CCPPAR_H__ */

观察到的警告:

defined macro '__CCPPAR_H__' is reserved to the compiler [MISRA 2012
Rule 21.1, required]

案例二:

#ifndef __CCP_H__
#define __CCP_H__    //lint !e9071

#include "Ccppar.h"

#define MAJOR   0x02
#define MINOR   0x01

/* other parts of code */ 

#endif

观察到以下 Misra 警告:

defined macro '__CCP_H__' is reserved to the compiler [MISRA 2012
Rule 21.1, required]

最佳答案

C 标准,更不用说 MISRA,保留所有以双下划线开头的标记。

您面临的实际风险是您的 C 标准库实现使用该符号甚至是编译器本身,这与您的冲突。

C11 §7.1.3 Reserved identifiers的一部分说:

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

另见 What does double underscore (__const) mean in C?

关于c - 定义的宏 '__CCP_H__' 保留给编译器 [MISRA 2012 规则 21.1,必需],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610951/

相关文章:

c - 以编程方式监视 XP 上的 CPU 负载

c - MISRA C 2012 是否表示不使用 bool

c - 使用#define 为结构成员起别名

c++ - 如果有一个带有通用单个参数的模板构造函数,为什么我必须有一个复制构造函数?

c - misra c 2004 "Implementation-defined behavior documented"规则 3.1 涵盖的问题

c - printf中的 “%.#s”是什么意思?

c - 可以使用 ANSI - C 脚本编写 Web 应用程序吗?

c - 如何让这个程序可以接受负数

c++ - 将常量转换为十六进制字符串的 C/C++ 宏函数

c - 什么时候应该在 C 语言中使用 UINT32_C()、INT32_C()... 宏?