由于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文档中找到它。
答案 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类型的指针的隐式转换。