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