Incompatibilidade binária, acessando um membro ou, pior ainda, chamando uma função da classe errada:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Uma função usa e está tudo bem:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Trazendo outra versão da classe:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Usando funções em main, a segunda definição altera a definição da classe. Isso leva à incompatibilidade binária e simplesmente trava no tempo de execução. E corrija o problema removendo o primeiro include em main.cpp:
//main.cpp
#include <include2.h> //<-- Remove this to fix the crash
#include <include1.h>
void smartFunction(class_w& x);
int main()
{
class_w w;
smartFunction(w);
return 0;
}
Nenhuma das variantes gera um erro de tempo de compilação ou link.
A situação vice-versa, adicionando um include, corrige a falha:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Essas situações são ainda mais difíceis ao corrigir erros em uma versão antiga do programa ou ao usar um objeto externo library / dll / shared. É por isso que às vezes devem ser seguidas as regras de compatibilidade com versões anteriores binárias.