C++ 11標準で、ヘッダーで定義されている場合のconstexpr
とstatic constexpr
グローバル変数の違いは何ですか?より具体的には、複数の翻訳単位に同じヘッダーが含まれる場合、どの宣言(存在する場合)が翻訳単位全体で同じ変数を定義することが保証されますか?
例えば。、
cexpr.h:
#ifndef CEXPR_H
#define CEXPR_H
constexpr int cint = 1;
static constexpr int scint = 1;
#endif
a.cpp:
#include "cexpr.h"
b.cpp:
#include "cexpr.h"
現在の例では違いはありません。変数宣言では、constexpr
はconst
を意味し、名前空間スコープのconst変数はデフォルトで内部リンケージを持っています(したがって、static
を追加しても何かを変更します)。
C++ 14では、変数をconstexpr
として宣言して、外部リンケージを持たせることはできません。ただし、これを単一の変換単位で行うだけの場合を除きます。その理由は、constexpr
変数には初期化子が必要であり、初期化子を使用した宣言は定義であり、定義は1つだけにする必要があるためです。
ただし、canができることは、extern
として宣言する(定義しない)ことができる通常の積分定数を使用することです。それが定義されている翻訳単位は、定数式としても使用できます。
lib.h:
extern const int a;
lib.cpp:
#include "lib.h"
const int a = 10;
int b[a] = {1, 2, 3}; // OK in this translation unit
C++ 17には、次のように言うことができる「インライン変数」という新機能があります。
inline constexpr int a = 10;
そして、これは繰り返し表示できる「インライン定義」であり、各定義はsameエンティティを定義します(他のすべての「インライン」エンティティと同様に、言語)。