gpt4 book ai didi

c - GCC 不警告从 void * 到 void ** 的隐式转换

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:41 25 4
gpt4 key购买 nike

由于 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.

关于c - GCC 不警告从 void * 到 void ** 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com