为什么 GCC 不会给出将 void * 传递给 void** 参数的错误?
Why won't GCC give errors passing a void * to a void** parameter?
gcc 不应该给出类型警告,因为 void*
正在传递给 void**
函数参数吗?
我试过 clang、gcc4.8 和 gcc9。 None 他们似乎很关心:
gcc -Wall -c t.c
void f(void *a)
{
}
void g(void **b)
{
f(b);
}
有趣的是,下面的下一个例子确实触发了这个警告:
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);
}
下一个给出:
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);
}
但这不是:
void f(void *a)
{
}
void g(char b)
{
f(&b);
}
所以有时它会关心传递给 void**
的指针类型,有时则不会。因此,void*
和 void**
并不总是被同等对待。 char**
也不会转换为 void**
.
void *
类型得到特殊对待。它基本上意味着指向某种未知类型的指针。 任何 对象指针都可以在不强制转换的情况下与void *
相互转换。
gcc 不应该给出类型警告,因为 void*
正在传递给 void**
函数参数吗?
我试过 clang、gcc4.8 和 gcc9。 None 他们似乎很关心:
gcc -Wall -c t.c
void f(void *a)
{
}
void g(void **b)
{
f(b);
}
有趣的是,下面的下一个例子确实触发了这个警告:
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);
}
下一个给出:
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);
}
但这不是:
void f(void *a)
{
}
void g(char b)
{
f(&b);
}
所以有时它会关心传递给 void**
的指针类型,有时则不会。因此,void*
和 void**
并不总是被同等对待。 char**
也不会转换为 void**
.
void *
类型得到特殊对待。它基本上意味着指向某种未知类型的指针。 任何 对象指针都可以在不强制转换的情况下与void *
相互转换。