1

One Definition Ruleについて読んでいました。次のように述べています。

1 つの .cpp ファイルがstruct S { int x;を定義している場合。}; もう 1 つの .cpp ファイルはstruct S { int y;を定義します。}; 、それらをリンクするプログラムの動作は未定義です。これは通常、名前のない名前空間で解決されます。

未定義の理由と方法がわかりませんか?誰かがこの背後にある実際の理由を説明してくれますか? 名前のない名前空間でどのように解決されますか?

4

1 に答える 1

4

おっしゃるとおりです。同じクラスSを異なる定義で 2 回定義しました。この言語の作成者は、これを行ってはならないことを宣言しています。その理由は、それを許可することは明らかに無意味であり、翻訳単位間の互換性を損なう結果になるからです。「正しい」定義はどれですか? コンパイラはどれを使用する必要がありますか?

名前のない名前空間は、実際には異なるクラスを定義する 2 つの定義をもたらしますS。これらは適切に と に似た名前が付けられmy-anonymous-namespace-1::Sますmy-anonymous-namespace-2::Sが、名前空間は匿名であるため、そのように参照することはできません。

于 2015-09-21T16:38:29.547 に答える