Всегда ли несовместимость источника подразумевает двоичную несовместимость?
Любые примеры, демонстрирующие, где совместимость с исходным кодом нарушена, но поддерживается двоичная совместимость, приветствуются.
3 ответа
Старая версия:
struct inner {
int bar;
}
struct foo {
struct inner i;
};
void quux(struct foo *p);
Новая версия:
struct inner2 {
int bar;
};
struct foo {
struct inner2 i;
};
void quux(struct foo *p);
Сломанный код:
struct foo x;
struct inner *i = &x.i;
i->bar = 42;
quux(&x);
Поскольку единственным отличием является имя структуры, а имя типа внутренней структуры стирается во время компиляции, двоичная несовместимость отсутствует.
Представьте, что тип параметра функции изменяется без изменения фактического размера или базового типа (скажем, с одного перечисления на другое или с long на int). Это нарушит исходный код из-за проверки типа, но может не повлиять на двоичную совместимость. (Зависит от конкретной среды - .NET будет раздражен, а C/C++ - нет.)
Различные версии статически связанных библиотек на разных машинах могут привести к тому, что двоичный файл, скомпилированный на машине A, будет работать правильно на машине B, но попытка скомпилировать его из источника на машине B не удастся. Но кроме этого, несовместимость источника обычно подразумевает двоичную несовместимость.