一个定义规则和两个翻译单元中不同的类定义



有这样的代码:

文件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.cppa.cpp中都定义了类A,并且在每个翻译单元中也定义了两个这些类的对象。A类的两个翻译单元的定义不同,但该代码可以编译。然而,一个定义规则说,程序中可以有许多类型的定义(但每个翻译单元只能有一个定义),这些定义应该是相同的。那么,即使两个文件中A类的定义不同,为什么这段代码也可以编译呢?

您的程序有未定义行为。c++ 11标准第3.2/6段规定:

类类型可以有多个定义(第9条),[…]]在程序中提供每个定义出现在不同的翻译单元中,并且提供定义满足以下要求。鉴于这样一个名为D的实体定义在多个翻译单元中,那么[…]

接下来是你的程序确实违反的需求列表。然而,在列表的末尾提到了这一点:

[…如果D的定义满足所有这些要求,那么程序应该表现得好像只有一个D的定义。如果D的定义不满足

最新更新