gcc不应该给出类型警告,因为void*
正在传递给void**
函数参数吗?
我尝试了clang,gcc4.8和gcc9。 他们似乎都不在乎:
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 *
相互转换或从中转换。