多个不相同的定义(一个定义规则)

如果类,枚举,内联函数,模板或模板成员具有外部链接并且在多个翻译单元中定义,则所有定义必须相同或根据单定义规则(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,它具有外部链接,在不同的翻译单元中,但这两个定义不相同。与在同一翻译单元内重新定义类不同,编译器不需要诊断此问题。