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?