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

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



yuri.nefedov@gmail.com -> debian-russian@lists.debian.org  @ Tue, 7 Oct 2014 14:15:27 +0400 (MSK):

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

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

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

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

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

Да, но из этого всего лишь следует, что API библиотеки не будет
содержать void f(struct S a[]).

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

Надо сказать, что мне в моей довольно богатой программистской практике
ни разу не пришлось воспользоваться функцией с аргументом типа массив...

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

Последней фразы я не понял.


Reply to: