Shouldn't gcc give a type warning because a void* is being passed to a void** function parameter?
I tried clang, gcc4.8 and gcc9. None of them seem to care:
gcc -Wall -c t.c
void f(void *a)
{
}
void g(void **b)
{
f(b);
}
Interestingly, the next example below does trigger this warning:
t.c: In function ‘g’:
t.c:7:2: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default]
f(&b);
^
t.c:1:6: note: expected ‘void **’ but argument is of type ‘char *’
void f(void **a)
void f(void **a)
{
}
void g(char b)
{
f(&b);
}
and this next one gives:
t.c: In function ‘g’:
t.c:7:2: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default]
f(&b);
^
t.c:1:6: note: expected ‘void **’ but argument is of type ‘char **’
void f(void **a)
void f(void **a)
{
}
void g(char *b)
{
f(&b);
}
but this does not:
void f(void *a)
{
}
void g(char b)
{
f(&b);
}
so sometimes it cares about the pointer type being passed to the void** and sometimes it does not. Thus, void* and void** are not always treated the same. Also char** won't cast to void**.
CodePudding user response:
The void * type gets special treatment. It basically means a pointer to some unknown type. Any object pointer may be converted to or from a void * without a cast.
