# 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.

Анализатор обнаружил в объявление константного экземпляра класса в заголовочном файле. При включении такого файла через 'include' произойдет создание множественных копий объекта. Если в классе есть конструктор, его код выполнится при каждом включении заголовочного файла, что может привести к нежелательным побочным эффектам.

Пример:

    //some_header.h

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

    // ....

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

Диагностика не распространяется на классы и структуры, у которых не определены конструкторы. Следующий код не приведет к срабатыванию:

    //some_header.h

    struct MyStruct
    {
      int field1;
      int field2;
    };

    // ....

    const MyStruct object{1, 2};

Также, чтобы избежать ошибки, можно объявить переменную как 'inline' (начиная с C++17) или 'extern'. В этом случае инициализация и вызов конструктора произойдет один раз.

Корректный пример:

    //some_header.h

    class MyClass
    {
      // ....
    };

    // ....

    inline const MyClass object{1, 2};

Примечание: использование ключевого слова 'constexpr' вместо 'const' при объявлении переменной не изменяет данное поведение. Согласно стандарту С++17, только constexpr-функции и constexpr-статические поля классов/структур объявляются со спецификатором inline неявно.

Более подробно данная проблема рассмотрена в статье "What Every C++ Developer Should Know to (Correctly) Define Global Constants".

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1043.