GCC没有警告从void *到void **的隐式演员

时间:2016-10-23 14:37:21

标签: c pointers gcc warnings void-pointers

由于void *是通用指针,因此可以隐式地向其投射任何其他类型。但是,void **不是指向指针的通用指针,因此如果我隐式地向它投射,我会期待来自gcc的警告。

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

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

如果我错误地称之为:

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

而不是string_store(&content...),我希望gcc能够对此发出警告。但它并没有。我有-Wall -Wextra选项到gcc。

是否有警告选项可以启用此功能?我无法在gcc文档中找到它。

1 个答案:

答案 0 :(得分:2)

  

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

你是对的void *是通用指针。这意味着两个事物:

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

因此,GCC缺乏警告并不是因为您隐式将投射到 void **,而是因为您隐式地从 {{1>投射 }}。根据您的要求,警告在许多情况下都是不合适的,包括这个非常真实的用例:

void *

因此,我不相信它甚至是可取的。对于更严格的指针转换,请使用C ++,其中大多数隐式void **ptr = malloc(sizeof *ptr); 强制转换已被删除。

显然,void *旗帜会对此发出警告,但你可能会对此感到非常恼火。

  

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