Одно правило определения и разные определения классов в двух единицах перевода
Вот этот код:
файл 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;
}
Итак, классA
определяется как в файлеmain.cpp а такжеa.cpp и есть также два объекта этих классов, определенных в каждой единице перевода. Определение в обеих единицах перевода классаA
отличается, но этот код компилируется. Однако одно правило определения говорит, что в программе может быть много определений типа (но только одно в каждой единице перевода), и эти определения должны быть одинаковыми. Так почему этот код компилируется, даже если определение классаA
отличается в обоих файлах?