Binäre Inkompatibilität, Zugriff auf ein Mitglied oder noch schlimmer, Aufruf einer Funktion der falschen Klasse:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Eine Funktion verwendet es und es ist in Ordnung:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Eine andere Version der Klasse einbringen:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Bei Verwendung der Hauptfunktionen ändert die zweite Definition die Klassendefinition. Dies führt zu binärer Inkompatibilität und stürzt einfach zur Laufzeit ab. Beheben Sie das Problem, indem Sie das erste Include in main.cpp entfernen:
//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;
}
Keine der Varianten erzeugt einen Kompilierungs- oder Verbindungszeitfehler.
Die umgekehrte Situation, in der ein Include hinzugefügt wird, behebt den Absturz:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Diese Situationen sind noch viel schwieriger, wenn ein Fehler in einer alten Programmversion behoben oder eine externe Bibliothek / DLL / ein freigegebenes Objekt verwendet wird. Deshalb müssen manchmal die Regeln der binären Abwärtskompatibilität befolgt werden.