I can have a definition like this in a header file?
constexpr double PI=3.14;
Is there any problem in having this in a header file that would be included to several cpp files?
I am worried that since it says in standard that this constexpr has its own memory, putting it in header, and adding header to several cpp files, generate multiple copies of the same value in memory and some other nasty problems.
I am using C++11
const on global/namespace scope implies
static (internal linkage), which means that every translation unit including this header gets its own copy of
PI. The memory for that static is only going to be allocated if an address or reference to it is taken, and the address is going to be different in each translation unit.
const variables was introduced specifically to use
const instead of
#define in header files in C++ to define constants. Without
static there would be multiple symbol definitions linker error if that header file is included in more than one translation unit which were linked together.
In C++17 you can also make it
inline, so that there is only ever a single copy of
PI if an address or reference to it is taken (i.e. not
inline variables were introduced in C++17 to allow for header-only libraries with non-const variable definitions in the header files.
In other words, you should use
constexpr for your constants in header files, if possible, otherwise
const. And if you require the address of that constant to be the same everywhere mark it as