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

标签 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 对此发出警告。但事实并非如此。我有 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/

相关文章:

c - 在哪里可以找到退出程序的源代码

c# - 将具有随机唯一数字的数组转换为具有连续数字的数组?

c - 当在 powerPC sizeof 上增加指向结构数组的指针时,无法按预期工作

c - 在 C 中编译 parse_command() 函数时出错

gcc - 无法修改数据段寄存器。尝试时抛出一般保护错误

c - 如何自动获取常量字符串的第一个字符作为常量字符?

iOS 64 位支持 C 框架 libxml2 "implicit conversion loses integer precision"

c++ - 指针神秘地重置为 NULL

c++ - 有目的地多次链接同一个对象时,如何避免多个定义错误?

c - 静态 pthreads 互斥体初始化