On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
[email protected] writes:
Тогда похоже, что между указателями на incomplete type и void*
вообще нет никакой разницы. Тем более что и преобразования
типа void* <-> struct* будут выполнятся молча, даже без
предупреждений. Просто это «сахар» для писателя/читателя программы.
Можно было бы и typedef обойтись.
Нет. Поскольку там не void*, а struct S*, Вы гарантированно подсунете в
функцию struct S*, а не что-то ещё. А то вдруг у Вас ещё одна библиотека
работает по такому же принципу. Тогда у Вас будет struct N* ещё
какой-нибудь. И если Вы его ненароком подсунете в функцию, которая
принимает struct S*, то получите ошибку на этапе компиляции.
А вы попробуйте. Вот рабочий пример:
------------------------------------------
struct s{
int test;
};
void check()
{
int a = 1;
struct s c = {3};
int* ptr_int = &a;
struct s* ptr_struct = &c;
void* ptr_void = NULL;
printf(" struct ptr= %p, void* %p\n",ptr_struct,ptr_void);
ptr_void = ptr_int;
ptr_void = ptr_struct;
ptr_int = ptr_void;
ptr_struct = ptr_void;
printf(" struct ptr= %p, void* %p\n",ptr_struct,ptr_void);
}
------------------------------------------
преобразования struct S* -> void*
и void* -> struct S* выполняются без лишних слов.
Поэтому void* и называют универсальным указателем.
Ю.