多個不相同的定義(一個定義規則)

如果類,列舉,行內函數,模板或模板成員具有外部連結並且在多個翻譯單元中定義,則所有定義必須相同或根據單定義規則(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,它具有外部連結,在不同的翻譯單元中,但這兩個定義不相同。與在同一翻譯單元內重新定義類不同,編譯器不需要診斷此問題。