为什么 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 * 相互转换。