繁体   English   中英

GCC对从void *到void **的隐式转换不发出警告

[英]GCC not warning on implicit cast from void * to void **

由于void *是通用指针,因此可以将其他任何类型隐式转换为它。 但是,void **不是通用的指针,因此如果我隐式地将其强制转换为指针,我会期望gcc发出警告。

在我的代码中,我有一个将指针指向不透明指针的函数(因为它可以重新分配并写回),如下所示:

char *string_store(void **ctxp, const char *str);

如果我将其错误地称为:

void *context;
...
name = string_store(content, "my name");

而不是string_store(&content...) ,我希望gcc对此发出警告。 但事实并非如此。 我对gcc有-Wall -Wextra选项。

是否有警告选项可将其打开? 我在gcc文档中找不到它。

由于void *是通用指针,因此可以将其他任何类型隐式转换为它。

没错, void *是通用指针。 这意味着件事:

  • 任何其他指针类型都隐式转换为void * ;
  • void *被隐式转换为任何其他指针类型。

因此,GCC缺乏警告不是因为您隐式地将其转换 void ** ,而是因为您是隐式地将其转换 void * 根据您的要求,警告在许多情况下都是不合适的,包括以下非常实际的用例:

void **ptr = malloc(sizeof *ptr);

因此,我认为这不是可取的。 对于更严格的指针转换,请使用C ++,其中大多数隐式void *强制类型已被删除。

显然,有-Wc++-compat标志将对此发出警告,但是您可能会对此感到非常恼火。

警告有关ISO C和ISO C ++的公共子集之外的ISO C构造,例如,请求从void *隐式转换为指向非void类型的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM