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