Eine Definitionsregel und unterschiedliche Klassendefinitionen in zwei Übersetzungseinheiten

Es gibt diesen Code:

Datei a.hpp:

class A;

Datei a.cpp:

#include "a.hpp"

struct A {
   int x = 777;
   int y;
};

A a_zew;

Datei 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;
}

Also klasseA wird sowohl in Datei definiertmain.cpp unda.cpp und es gibt auch zwei Objekte dieser Klassen, die in jeder Übersetzungseinheit definiert sind. Definition in beiden Übersetzungseinheiten der KlasseA ist anders, aber dieser Code kompiliert. Eine Definitionsregel besagt jedoch, dass es im Programm viele Definitionen des Typs geben kann (aber nur einzelne in jeder Übersetzungseinheit), und diese Definitionen sollten gleich sein. Warum wird dieser Code kompiliert, selbst wenn eine Klassendefinition vorliegt?A ist in beiden Dateien unterschiedlich?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage