[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 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: