c语言 - 为什么 GCC 不会给出将 void * 传递给 void** 参数的错误?



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 *相互转换或从中转换。

相关内容

  • 没有找到相关文章

最新更新