【问题标题】:GCC not warning on implicit cast from void * to void **GCC 不会对从 void * 到 void ** 的隐式转换发出警告
【发布时间】:2017-03-05 09:18:27
【问题描述】:

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

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

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

如果我把它错误地称为:

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

我希望 gcc 对此发出警告,而不是 string_store(&content...)。但事实并非如此。我有 gcc 的 -Wall -Wextra 选项。

是否有一个警告选项可以打开它?我在 gcc 文档中找不到它。

【问题讨论】:

  • 我想我的意思是这样写的问题:“to void ** from void *”
  • 您可以编辑自己问题的标题和内容。 :)
  • 哦 - 我忘了。反正看起来是对的。也许我的想法正在...... :-)

标签: c pointers gcc warnings void-pointers


【解决方案1】:

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

你说得对,void * 是通用指针。这意味着 件事:

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

因此,GCC 没有发出警告并不是因为您隐式地将 转换为 void **,而是因为您隐式地转换了 来自 void *。根据您的要求,警告在许多情况下是不合适的,包括这个非常真实的用例:

void **ptr = malloc(sizeof *ptr);

因此,我认为它甚至是不可取的。对于更严格的指针转换,请使用 C++,其中大部分隐式 void * 类型转换已被移除。

显然,-Wc++-compat 标志会对此发出警告,但您可能会对此感到非常恼火。

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

【讨论】:

  • 噢!你是绝对正确的。 “从 void *”而不是“到 void **”。谢谢! (我现在因为没有看到这个而感到有点昏暗!)。
猜你喜欢
  • 2017-01-12
  • 2011-10-30
  • 2022-01-11
  • 2017-06-30
  • 2013-08-19
  • 1970-01-01
  • 2015-03-12
  • 2011-11-15
  • 2011-12-05
相关资源
最近更新 更多