Incompatibilité binaire, accès à un membre ou pire encore, appel d'une fonction de la mauvaise classe:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Une fonction l'utilise, et c'est ok:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Apporter une autre version de la classe:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
En utilisant les fonctions principales, la deuxième définition modifie la définition de classe. Cela conduit à une incompatibilité binaire et se bloque simplement lors de l'exécution. Et corrigez le problème en supprimant le premier include dans 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;
}
Aucune des variantes ne génère une erreur de temps de compilation ou de liaison.
La situation vice versa, l'ajout d'une inclusion corrige le crash:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Ces situations sont encore plus difficiles à résoudre lors de la correction de bogues dans une ancienne version du programme ou lors de l'utilisation d'une bibliothèque externe / dll / objet partagé. C'est pourquoi il faut parfois respecter les règles de compatibilité descendante binaire.