Rule A3-1-1 (required, architecture / design / implementation,automated)
It shall be possible to include any header file in multiple translation units without violating the One Definition Rule.
Rationale
A header file is a file that holds declarations used in more than one translation unit and acts as an interface between separately compiled parts of a program. A header file often contains classes, object declarations, enums, functions, inline functions, templates, typedefs, type aliases and macros.
In particular, a header file is not supposed to contain or produce definitions of global objects or functions that occupy storage, especially objects that are not declared “extern” or definitions of functions that are not declared “inline”.
Example
//% $Id: A3-1-1.hpp 289436 2017-10-04 10:45:23Z michal.szczepankiewicz $
#include <cstdint>
void F1();
// Compliant
extern void F2(); // Compliant
void F3()
{
} // Non-compliant
static inline void F4()
{
} // Compliant
template <typename T>
void F5(T)
{
} // Compliant
std::int32_t a; // Non-compliant
extern std::int32_t b; // Compliant
constexpr static std::int32_t c = 10; // Compliant
namespace ns
{
constexpr static std::int32_t d = 100; // Compliant
const static std::int32_t e = 50; // Compliant
static std::int32_t f; // Non-compliant
static void F6() noexcept; // Non-compliant
}
See also
MISRA C++ 2008 [7]: Rule 3-1-1 It shall be possible to include any header file in multiple translation units without violating the One Definition Rule.