有这样的代码:
文件a.hpp:
class A;
文件a.cpp:
#include "a.hpp"
struct A {
int x = 777;
int y;
};
A a_zew;
文件main.cpp:
#include "a.hpp"
#include <iostream>
class A { // definition of class A is different than above
public:
int x;
};
int main() {
A a; // definition of class A in main.cpp
extern A a_zew; // definition of class A in a.cpp
std::cout << a_zew.x << std::endl; // 777
std::cout << a.x << std::endl; // junk
return 0;
}
所以在文件main.cpp和a.cpp中都定义了类A
,并且在每个翻译单元中也定义了两个这些类的对象。A
类的两个翻译单元的定义不同,但该代码可以编译。然而,一个定义规则说,程序中可以有许多类型的定义(但每个翻译单元只能有一个定义),这些定义应该是相同的。那么,即使两个文件中A
类的定义不同,为什么这段代码也可以编译呢?
您的程序有未定义行为。c++ 11标准第3.2/6段规定:
类类型可以有多个定义(第9条),[…]]在程序中提供每个定义出现在不同的翻译单元中,并且提供定义满足以下要求。鉴于这样一个名为
D
的实体定义在多个翻译单元中,那么[…]
接下来是你的程序确实违反的需求列表。然而,在列表的末尾提到了这一点:
[…如果
D
的定义满足所有这些要求,那么程序应该表现得好像只有一个D
的定义。如果D
的定义不满足。