# V1043. A global object variable is declared in the header. Multiple copies of it will be created in all translation units that include this header file.

The analyzer has detected a declaration of a constant object in a header file. Including this file using the 'include' directive will result in creating multiple copies of that object. If the class has a constructor, it will be called each time the header is included, which may have undesirable side effects.

For example:

    //some_header.h

    class MyClass
    {
      int field1;
      int field2;
      MyClass (int a, int b)
      {
        // ....
      }
    };

    // ....

    const MyClass object{1, 2}; // <=

The diagnostic ignores classes and structures with no constructors defined. The following code snippet will not trigger the warning:

    //some_header.h

    struct MyStruct
    {
      int field1;
      int field2;
    };

    // ....

    const MyStruct object{1, 2};

You can also avoid this error by declaring the variable as 'inline' (starting with C++17) or 'extern'. With this fix, the variable initialization and constructor call will be performed only once.

Fixed version:

    //some_header.h

    class MyClass
    {
      // ....
    };

    // ....

    inline const MyClass object{1, 2};

Note: using the 'constexpr' keyword instead of 'const' in the variable declaration doesn't change this behavior. According to the C++17 standard, only constexpr functions and static constexpr class/structure fields are implicitly declared as inline.

This issue is discussed in detail in the article "What Every C++ Developer Should Know to (Correctly) Define Global Constants".

You can look at examples of errors detected by the V1043 diagnostic.