由于 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 文档中找不到它。
最佳答案
As void * is the generic pointer, any other type can be implicitly cast to it.
你说得对,void *
是通用指针。这意味着两件事:
- 任何其他指针类型都会隐式转换为
void *
; void *
隐式转换为任何其他指针类型。
因此,GCC 缺乏警告并不是因为您隐式转换到 void **
,而是因为您隐式转换from void *
。正如您所要求的,警告在许多情况下是不合适的,包括这个非常真实的用例:
void **ptr = malloc(sizeof *ptr);
因此,我认为这是不可取的。对于更严格的指针转换,请使用 C++,其中大多数隐式 void *
转换已被删除。
显然,-Wc++-compat
标志会对此发出警告,但您可能会对此感到非常恼火。
Warn about ISO C constructs that are outside of the common subset of ISO C and ISO C++, e.g. request for implicit conversion from void * to a pointer to non-void type.
关于c - GCC 不会对从 void * 到 void ** 的隐式转换发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204137/