- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于 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/
我是一名优秀的程序员,十分优秀!