[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Чёртов язык Си!



On Tue, 7 Oct 2014, Artem Chuprina wrote:

yuri.nefedov@gmail.com -> debian-russian@lists.debian.org  @ Tue, 7 Oct 2014 12:16:35 +0400 (MSK):

y>   p.s. Вообще-то надо понимать, что декларация (объявление) -
y>   это всего лишь сообщение компилятору, что такой объект существует.
y>   Ну сообщили, что структура где-то определена, но потом-то
y>   будете пользоваться полями этой структуры. Так что утверждение,
y>   что перекомпиляция не нужна, я не понимаю.

Ты такой умный, но таких простых вещей не понимаешь. Имеется в виду,
что если библиотека не предоставляет определения структуры, и
следовательно, использующая ее программа не может пользоваться ее
полями, а может пользоваться только функциями этой библиотеки, передавая
ей или получая от них указатели на такую структуру, то при изменениях
этой структуры потребуется перекомпиляция только библиотеки, но не
использующих ее программ (ну, при условии, что библиотека динамическая,
а не вкомпилируется в бинарник программы).  Поскольку API не меняется ни
текстовый, ни бинарный.  Называется этот прием "непрозрачный указатель"
(opaque pointer), иногда говорят "непрозрачная структура" (opaque
structure) и используется в хвост и в гриву, начиная с libc (FILE *).

Объявление структуры при этом нужно исключительно для контроля типов,
чтобы не передать в функцию указатель не на то.  А так можно было бы
ограничиться и void *.


 Ну да, не такой умный, но _это_ я понимаю.)
 В этом контексте слово структура совсем не важно.
 Указатель он и в Африке указатель.

 В этом случае нельзя передавать массивы:

 void f(struct S a[]) == void f(struct S* a)

 так как sizeof(struct S) может поменяться.
 Даже без обращения к полям.

 Это не возражение. Это уточнение.
 Размер грабель неопределен.
Ю.

Reply to: