標準は、変数がodrで使用されていない場合、変数の定義の数に制限がないことを暗示しているようです(§3.2/3):
すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数または変数の定義が 1 つだけ含まれている必要があります。診断は必要ありません。
翻訳単位内で変数を複数回定義することはできないと言っています(§3.2/1):
変換単位には、変数、関数、クラス型、列挙型、またはテンプレートの複数の定義が含まれてはなりません。
しかし、プログラム全体で、odr を使用しない変数に対する制限を見つけることができません。では、次のようなものをコンパイルできないのはなぜですか。
// other.cpp
int x;
// main.cpp
int x;
int main() {}
これらのファイルを g++ 4.6.3 でコンパイルおよびリンクすると、multiple definition of 'x'
. 正直なところ、私はこれを期待していますが、x
(私が知る限り)どこでも使用されていないため、標準がこれをどのように制限しているかわかりません。それとも未定義の動作ですか?