This rule is part of MISRA C++:2023.
Usage of this content is governed by Sonar’s terms and conditions. Redistribution is
prohibited.
Rule 19.2.1 - Precautions shall be taken in order to prevent the contents of a header file [1] being included more than once
Category: Required
Analysis: Decidable,Single Translation Unit
Amplification
In order to facilitate checking, the contents of the header file [1] shall be protected from being included more than once using one of
the following two forms of include guard:
<start-of-file>
#if !defined ( IDENTIFIER )
#define IDENTIFIER
// Contents of file
#endif
<end-of-file>
<start-of-file>
#ifndef IDENTIFIER
#define IDENTIFIER
// Contents of file
#endif
<end-of-file>
Notes:
- The identifier used to test and record whether a given header file [1] has already been included shall be unique across all the
header files [1] included within the translation unit;
- Comments are permitted anywhere within these forms.
Rationale
When a translation unit contains a complex hierarchy of nested header files [1], it is possible for a particular header
file [1] to be included more than once. This can be, at best, a source of confusion. If this multiple inclusion leads to multiple or conflicting
definitions, then this can result in erroneous or undefined behaviour.
Note: implementations may provide other mechanisms to prevent multiple inclusion — for example #pragma once (use of
which is restricted by M23_213: MISRA C++ 2023 Rule 19.6.1). However, their use is not permitted as they are not specified within the
C++ Standard.
Example
// file.h
#ifndef FILE_H // Non-compliant - no include guard in this file
#define FILEH // <-- this does not #define FILE_H
#endif
Glossary
[1] Header file
A header file is considered to be any file that is included during preprocessing (for example via the #include directive),
regardless of its name or suffix.
Copyright The MISRA Consortium Limited © 2023