Почему нельзя уменьшить размер структуры при замене старой библиотеки? - PullRequest
0 голосов
/ 22 апреля 2010

Когда мы пишем новую версию библиотеки, которую мы создали (на языке C), нам запрещено изменять, скажем, размер структуры, чтобы она была меньше. Зачем?

В частности,

версия 1 имеет это:

struct foo {
    int a;
    int b;
}

версия 2 имеет это:

struct foo {
    char a;
    char b;
}

и мы отделяем определение структуры от объявления, чтобы пользователь библиотеки не мог получить доступ к членам этой структуры.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Сложно догадаться, потому что может быть несколько более или менее веских причин, вероятно, все они связаны с попытками обеспечения обратной совместимости и во избежание обновления всех программ при обновлении. Структуры

могут (ab) использоваться многими способами, например, люди могут иметь указатели внутри структуры, и вместо доступа к членам структуры через имя может бродить указатель:

struct {
  int a;
  int b;
  int c;
} s;

и если кто-то обращается к структуре с помощью

struct s mys;
... 
int *p = &mys.a; ++p; ++p; *p = 3;

сломается, если структура станет меньше

В качестве примера Windows (известная своей длинной историей головной боли обратной совместимости) часто имеет размер структуры в качестве первого члена в структуре, а затем приложения сначала читают это значение, чтобы угадать, с какой версией структуры они работают, Разумеется, это означало, что в зависимости от размера будет несколько структур с одинаковыми именами, соответствующих различным версиям (дрожь).

Конечно, недостаточно для обеспечения обратной совместимости, но это помогает.

2 голосов
/ 22 апреля 2010

Основная причина (и я не программист на C здесь, но я довольно уверен в своем ответе), что это будет критическое изменение .

Разрывное изменение означает, что это будет изменение, которое потребует от пользователей библиотеки изменить свой код, что никогда не является хорошей вещью. Это означает, что им, в свою очередь, придется отправлять новую версию своих программ, если они хотят использовать последнюю версию вашей библиотеки, что не всегда возможно.

...