Niekompatybilność binarna, dostęp do członka lub jeszcze gorzej, wywołanie funkcji niewłaściwej klasy:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Funkcja go używa i jest w porządku:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Wprowadzanie innej wersji klasy:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Używając funkcji main, druga definicja zmienia definicję klasy. Prowadzi to do binarnej niezgodności i po prostu ulega awarii w czasie wykonywania. I napraw ten problem, usuwając pierwszy plik include w 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;
}
Żaden z wariantów nie generuje błędu czasu kompilacji lub łącza.
Odwrotna sytuacja, dodanie parametru include naprawia awarię:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Sytuacje te są jeszcze trudniejsze, gdy naprawia się błąd w starej wersji programu lub używa zewnętrznej biblioteki / dll / współdzielonego obiektu. Dlatego czasami należy przestrzegać zasad binarnej kompatybilności wstecznej.