Uma regra de definição e diferentes definições de classe em duas unidades de tradução
Existe este código:
arquivo a.hpp:
class A;
arquivo a.cpp:
#include "a.hpp"
struct A {
int x = 777;
int y;
};
A a_zew;
arquivo 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;
}
Então classeA
é definido em arquivomain.cpp ea.cpp e há também dois objetos dessas classes definidos em cada unidade de tradução. Definição em ambas as unidades de tradução da classeA
é diferente, mas esse código é compilado. No entanto, uma regra de definição diz que pode haver muitas definições do tipo no programa (mas apenas uma única em cada unidade de tradução) e essas definições devem ser as mesmas. Então, por que esse código compila mesmo se a definição de classeA
é diferente em ambos os arquivos?