Бінарна несумісність, доступ до члена або ще гірше, виклик функції неправильного класу:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Функція використовує її, і це нормально:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Переведення в іншу версію класу:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Використовуючи основні функції, друге визначення змінює визначення класу. Це призводить до бінарної несумісності і просто виходить з ладу під час виконання. І усуньте проблему, видаливши перше включення до 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;
}
Жоден із варіантів не створює помилку часу компіляції чи посилання.
Навпаки ситуація, додаючи включає, виправляє збій:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Ці ситуації ще набагато складніші під час виправлення помилки в старій версії програми або використання зовнішньої бібліотеки / dll / спільного об'єкта. Ось чому іноді слід дотримуватися правил бінарної сумісності назад.