Incompatibilità binaria, accesso a un membro o, peggio ancora, chiamata una funzione della classe sbagliata:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Una funzione la usa ed è ok:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Inserisci un'altra versione della classe:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Usando le funzioni in main, la seconda definizione cambia la definizione di classe. Porta a incompatibilità binaria e si arresta semplicemente in fase di esecuzione. E risolvi il problema rimuovendo la prima inclusione in 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;
}
Nessuna delle varianti genera un errore di tempo di compilazione o collegamento.
La situazione viceversa, l'aggiunta di un'inclusione risolve l'arresto anomalo:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Queste situazioni sono ancora più difficili quando si correggono i bug in una vecchia versione del programma o si utilizza un oggetto library / dll / shared esterno. Ecco perché a volte devono essere seguite le regole della compatibilità binaria con le versioni precedenti.