多個不相同的定義(一個定義規則)
如果類,列舉,行內函數,模板或模板成員具有外部連結並且在多個翻譯單元中定義,則所有定義必須相同或根據單定義規則(ODR) 未定義行為。
foo.h
:
class Foo {
public:
double x;
private:
int y;
};
Foo get_foo();
foo.cpp
:
#include "foo.h"
Foo get_foo() { /* implementation */ }
main.cpp
:
// I want access to the private member, so I am going to replace Foo with my own type
class Foo {
public:
double x;
int y;
};
Foo get_foo(); // declare this function ourselves since we aren't including foo.h
int main() {
Foo foo = get_foo();
// do something with foo.y
}
上述程式表現出未定義的行為,因為它包含兩個定義類::Foo
,它具有外部連結,在不同的翻譯單元中,但這兩個定義不相同。與在同一翻譯單元內重新定義類不同,編譯器不需要診斷此問題。