ODRを理解しようとしています。 私はこのような一つのファイルpr1.cppを作成:1定義ルール - 編集
struct S{
int a;
};
この
struct S {
char a;
};
と、このようなメインファイルのような第二のファイルpr2.cpp:
#include <iostream>
int main() {
return 0;
}
私はコンパイルしていますコマンドを使用して端末を使用する:
g++ -Wall -Wextra pr1.cpp pr2.cpp main.cpp -o mypr
コンパイラは何のエラーも見つけませんが、 "S"型の宣言が2つあります...実際に起こっていることを理解していません。 "リンケージ"フェーズの後にエラーが発生すると思いますODR違反.. は、私はエラーが唯一の追加main.cppにファイルを編集することができます:
#include "pr1.cpp"
#include "pr2.cpp"
を誰もが何が起こっているのか私にexmplainすることはできますか?
どちらのオブジェクトも決して作成しないので、コードが破棄されたと見なします。 – xyious
[動作は未定義です。](http://eel.is/c++draft/basic.def.odr#6.sentence-4) – cpplearner
POD構造は実際にはコンパイル時のもので、使用されていないものは、オブジェクトや実行可能ファイルにはトレースがありません。同じ名前の2つの異なる構造体を定義しているため(実際にはスペースを変更するだけで、メンバが同じであってもそれらを異ならせることができます)、*技術的には未定義の動作*です。 –