假设有人想创建一个可以容纳多个函数指针和不同类型的数组.他将如何这样做呢?也许一个void指针数组可以工作?...事实证明,不是因为为了使用存储在void指针中的函数,你必须将它们(void指针)转换/转换回函数指针和...
"函数指针和void指针之间的转换是不可能的.void*从不是函数指针的通用指针类型,仅用于对象指针.它们不是兼容的类型.
[...]你可以在void*和一个函数指针之间进行转换,但是会发生什么是未定义的行为.您将依赖系统特定的非标准扩展."
- @ Lundin(这里)
代替...
稍微好一点的是使用函数指针类型,如void(*)(void)作为泛型指针.您可以转换为/从不同的函数指针转换,将发生的是特定于编译器(实现定义的行为).也就是说,代码仍然是不可移植的,但至少你不会冒程序崩溃来调用未定义的行为.
- @ Lundin(这里)
也就是说,从一个函数指针转换到另一个函数指针甚至意味着什么呢?
有人可以解释一下吗.也许是一个例子.
混淆了如何访问存储在void指针(void*)中的函数指针.
假设你有这个:
void *functions[] =
{
&sqrt, // int ft_sqrt(int nb);
&power,
&logN,
&factorial;
};
// An array of void pointers, each storing a function pointer.
Run Code Online (Sandbox Code Playgroud)
如果我想访问该sqrt功能,我的猜测如下:
(int (*)(int)) functions[0](x)
但我的猜测是错误的:
error: called object type 'void *' is not a function or function pointer
那么如何访问其中一个函数呢?
c pointers function-pointers void-pointers typecasting-operator
在试图添加此标志:-Wshadow=compatible-local (文档)编制,但它只是不断抛出此消息时:
`error: unknown warning option '-Wshadow=compatible-local';
did you mean '-Wshadow- uncaptured-local'?
[-Werror,-Wunknown-warning-option]`
Run Code Online (Sandbox Code Playgroud)
我的makefile的片段:
# COMPILER & FLAGS ============================================================
CC = gcc
CFLAGS = -g -std=c11 -O3 \
-Wall -Wextra -Werror \
-Wshadow -Wshadow=compatible-local \
-Wno-sign-compare \
-fsanitize=integer \
-fsanitize=undefined \
-fsanitize=address -fsanitize-address-use-after-scope
Run Code Online (Sandbox Code Playgroud)
更新:
注意:我的编译器版本是clang-900.0.39.2.(它说clang即使你输入gcc,因为我正在使用macOS并且很好...... @Aconcagua解释了为什么在下面)
有人知道为什么会这样吗?和/或如何修复它?