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

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



yuri.nefedov@gmail.com writes:

> On Tue, 7 Oct 2014, Artem Chuprina wrote:
>
>>
>> y>  В С нет разницы между void f(struct S a[]) и  void f(struct S *a)
>> y>  - компилятору это всё равно.
>> y>  Моё беспокойство было, как будет обрабатываться a[i] или, что то же
>> y>  самое *(a+i). Как компилятор предотвратит использование такой
>> y>  конструкции?
>>
>> Я полагаю, скажет "incomplete type" и обломает компиляцию.
>>
>
>  Мы говорим об одном и том же. По стандарту языка С
>  incomplete type == types that describe objects but lack information
>  needed to determine their sizes
>
>  Тогда похоже, что между указателями на incomplete type и void*
>  вообще нет никакой разницы. Тем более что и преобразования
>  типа void* <-> struct* будут выполнятся молча, даже без
>  предупреждений. Просто это «сахар» для писателя/читателя программы.
>  Можно было бы и typedef обойтись.

Нет. Поскольку там не void*, а struct S*, Вы гарантированно подсунете в
функцию struct S*, а не что-то ещё. А то вдруг у Вас ещё одна библиотека
работает по такому же принципу. Тогда у Вас будет struct N* ещё
какой-нибудь. И если Вы его ненароком подсунете в функцию, которая
принимает struct S*, то получите ошибку на этапе компиляции.

Attachment: pgpZppA5DUisB.pgp
Description: PGP signature


Reply to: