﻿# 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' произойдет создание множественных копий объекта\. Если в классе есть конструктор, его код выполнится при каждом включении заголовочного файла, что может привести к нежелательным побочным эффектам\.

Пример:

```cpp
//some_header.h

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

// ....

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

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

```cpp
//some_header.h

struct MyStruct
{
  int field1;
  int field2;
};

// ....

const MyStruct object{1, 2};
```

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

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

```cpp
//some_header.h

class MyClass
{
  // ....
};

// ....

inline const MyClass object{1, 2};
```

**Примечание:** использование ключевого слова 'constexpr' вместо 'const' при объявлении переменной не изменяет данное поведение\. Согласно [стандарту С\+\+17](http://eel.is/c++draft/dcl.constexpr#1.sentence-2), только constexpr\-функции и constexpr\-статические поля классов/структур объявляются со спецификатором inline неявно\.

Более подробно данная проблема рассмотрена в статье "[What Every C\+\+ Developer Should Know to \(Correctly\) Define Global Constants](https://www.fluentcpp.com/2019/07/23/how-to-define-a-global-constant-in-cpp/)"\.