4

与えられた 1 つのソース ファイル

int a = 1;

と別のソースファイル

int a = 1;
int main() { }

実装は一般的にこれを拒否します。使用されていませんが、それは私には理にかなっていますa

ただし、これがエラーであると標準が示している場所を見つけることができません。

Cでは、これは(私のものを強調)でカバーされています:

6.9 外部定義

5外部定義は、関数 (インライン定義以外) またはオブジェクトの定義でもある外部宣言です。sizeof外部リンケージで宣言された識別子が式で使用される場合 (結果が整数定数である演算子のオペランドの一部として以外)、プログラム全体のどこかに、識別子の外部定義が 1 つだけ存在する必要があります。それ以外の場合は、1 つしか存在しないものとします。

これは制約の外側に現れるため、C では動作は単純に定義されていません。実装はそれを拒否することが許可されています。または、警告なしで静かに受け入れることが許可されています。この場合、動作については保証されません。意図はC++でも同じだと確信しています。

[basic.def.odr] の C++ 標準の「プログラム全体のどこかに、識別子の外部定義が 1 つだけ存在する」に相当するものを見つけることができます。

3.2 1 つの定義規則 [basic.def.odr]

4 すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数または変数の定義が 1 つだけ含まれている必要があります。診断は必要ありません。[...]

しかし、odr で使用されていないオブジェクトまたは関数をカバーする文言を見つけることができません。標準は、これがエラーであることをどこかに明記していますか? もしそうなら、どこですか?

[basic.def.odr] には、通常、p6 で複数の定義を持つことができる特定の種類のエンティティに対する制限も含まれており、事実上、すべての定義が同一でなければならないことが述べられています。しかし、それは「クラス型(条項9)、列挙型(7.2)、外部リンケージを持つインライン関数(7.1.2)、クラステンプレート(条項14)、非静的関数テンプレート(14.5.6)、静的データ」のみをカバーしていますクラス テンプレートのメンバー (14.5.1.3)、クラス テンプレートのメンバー関数 (14.5.1.1)、または一部のテンプレート パラメーターが指定されていないテンプレートの特殊化 (14.7、14.5.5)」、グローバル変数ではなく、さらに、定義は一致します。

[dcl.link] がこれに対処するのではないかと思いましたが、そうではありません。最も近いのは、[basic.def.odr] を参照するだけの C リンケージを持つエンティティに関するメモです。

7.5 リンケージ仕様 [dcl.link]

6 [...] [注: C 言語リンケージを持つ特定の名前を持つエンティティーの定義は 1 つだけプログラムに現れる場合があります (3.2 を参照)。これは、そのようなエンティティを複数の名前空間スコープで定義してはならないことを意味します。--文末] [...]

これが間違いであることは明らかなので、私は単に何かを見落としているとほぼ確信しています。

4

0 に答える 0