主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Dir 4.10

应采取措施防止头文件的内容被多次包含

描述

指令定义

应采取措施防止头文件的内容被多次包含 1 .

理由

当翻译单元包含嵌套的头文件的复杂层次结构时,可能出现某个头文件被多次包含的情况,这会导致混淆。如果这种多次包含导致出现多个或相互冲突的定义,则您的程序可能出现未定义或错误的行为。

例如,假设一个头文件包含:

#ifdef _WIN64
   int env_var;
#elseif  
   long int env_var;
#endif
如果头文件包含在两个包含路径中,一个定义了宏 _WIN64,另一个取消了该宏的定义,则可能会出现 env_var 的定义冲突。

Polyspace 实现

如果您包含一个内容未防止多次包含的头文件,则分析会提示违反此指令。违规内容在头文件的开头处显示。

您可以通过多种方法防止头文件被多次包含。例如,使用预处理器指令 ifdefifndef 作为包含保护:

<start-of-file>
#ifndef <control macro>
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>
<start-of-file>
#ifdef <control macro> 
#error ...
#else
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

如果一个头文件包含此代码,则该头文件不合规,因为宏保护未覆盖头文件的全部内容。线 void func2(void) 位于保护区外。

注意

您可以在宏保护之外添加注释。

#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func(void);
#endif
void func2(void);

如果一个头文件包含此代码,则该头文件不合规,因为宏保护未覆盖头文件的全部内容。线 void func(void) 位于保护区外。

注意

您可以在宏保护之外添加注释。


void func(void);
#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func2(void);
#endif

如果一个头文件包含以下代码,则该头文件不合规,因为 #ifndef 语句中的宏名称与后续 #define 语句中的宏名称不一致。

#ifndef  __MY_MACRO__ 
#define __MY_MARCO__
    void func(void);
    void func2(void);
#endif

您可以使用分支包含保护结构来防止多次包含:

#ifndef FOO
#define FOO 1
#else
#undef FOO
#define FOO 2 
/*...Code content */
#endif
此类包含保护符合规。

检查信息

组:代码设计
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.