Incompatibilidad binaria, acceder a un miembro o, lo que es peor, llamar a una función de la clase incorrecta:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
Una función lo usa, y está bien:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
Trayendo otra versión de la clase:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
Usando funciones en main, la segunda definición cambia la definición de clase. Conduce a incompatibilidad binaria y simplemente se bloquea en tiempo de ejecución. Y solucione el problema eliminando la primera inclusión en 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;
}
Ninguna de las variantes genera un error de tiempo de compilación o enlace.
La situación viceversa, al agregar un include, corrige el bloqueo:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
Estas situaciones son aún más difíciles cuando se corrige un error en una versión antigua del programa o cuando se usa una biblioteca externa / dll / objeto compartido. Es por eso que a veces se deben seguir las reglas de compatibilidad binaria hacia atrás.
#include
d.#include <vld.h>
en una posición estratégica en su código. Eliminar o agregar ese encabezado de VLD no "interrumpe" el programa, pero afecta significativamente el comportamiento del tiempo de ejecución. He visto a VLD desacelerar un programa hasta el punto de que se volvió inutilizable.