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 文档中找不到它。

As void * is the generic pointer, any other type can be implicitly cast to it.

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

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

因此,GCC 没有发出警告并不是因为您隐式地将 转换为 void **,而是因为您隐式将 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.