Re: Чёртов язык Си!
yuri.nefedov@gmail.com -> debian-russian@lists.debian.org @ Tue, 7 Oct 2014 18:16:32 +0400 (MSK):
>> y> В С нет разницы между void f(struct S a[]) и void f(struct S *a)
>> y> - компилятору это всё равно.
>> y> Моё беспокойство было, как будет обрабатываться a[i] или, что то же
>> y> самое *(a+i). Как компилятор предотвратит использование такой
>> y> конструкции?
>>
>> Я полагаю, скажет "incomplete type" и обломает компиляцию.
y> Мы говорим об одном и том же. По стандарту языка С
y> incomplete type == types that describe objects but lack information
y> needed to determine their sizes
y> Тогда похоже, что между указателями на incomplete type и void*
y> вообще нет никакой разницы. Тем более что и преобразования
y> типа void* <-> struct* будут выполнятся молча, даже без
y> предупреждений. Просто это «сахар» для писателя/читателя программы.
y> Можно было бы и typedef обойтись.
Между void * и struct *, может, и без предупреждения. А между struct A * и struct B *?
---- test.c ----
struct S0;
struct S1;
void f (struct S0 *p) {}
int main (int argc, char **argv) {
f((struct S1 *)0);
}
----------------
zsh% gcc -c test.c
test.c: In function ‘main’:
test.c:7:12: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default]
test.c:4:6: note: expected ‘struct S0 *’ but argument is of type ‘struct S1 *’
Ну и дальше по вкусу.
Reply to: