有这段代码:
档案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
的定义不同,为什么这个代码会编译?
答案 0 :(得分:8)
您的程序有未定义的行为。 C ++ 11标准的Paragaph 3.2 / 6指定:
在一个程序中可以有多个类类型的定义(第9条),[...]提供每个定义 出现在不同的翻译单元中,并且定义满足以下要求。特定 这样一个名为
D
的实体在多个翻译单元中定义,然后[...]
以下是您的计划确实违反的要求列表。但是,在列表的末尾,提到了这一点:
[......]如果
D
的定义满足所有这些要求, 然后程序的行为应该像D
的单一定义一样。 如果D
的定义不满足 这些要求,然后行为未定义。