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: