【发布时间】:2016-08-07 08:07:54
【问题描述】:
我有一个函数,它接受一个字符串、一个字符串数组和一个指针数组,并在字符串数组中查找字符串,并从指针数组中返回相应的指针。由于我将它用于几个不同的事情,指针数组被声明为 (void *) 的数组,调用者应该知道实际存在什么样的指针(因此它作为返回值返回什么样的指针)。
但是,当我传入一个函数指针数组时,当我使用 -Wpedantic 编译时收到警告:
叮当声:
test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
between void pointer and function pointer [-Wpedantic]
gcc:
test.c:40:8: warning: ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
fptr = find_ptr("quux", name_list, (void **)ptr_list,
这是一个测试文件,尽管有警告,但它确实正确打印了“quux”:
#include <stdio.h>
#include <string.h>
void foo(void)
{
puts("foo");
}
void bar(void)
{
puts("bar");
}
void quux(void)
{
puts("quux");
}
typedef void (* voidfunc)(void);
voidfunc ptr_list[] = {foo, bar, quux};
char *name_list[] = {"foo", "bar", "quux"};
void *find_ptr(char *name, char *names[], void *ptrs[], int length)
{
int i;
for (i = 0; i < length; i++) {
if (strcmp(name, names[i]) == 0) {
return ptrs[i];
}
}
return NULL;
}
int main() {
voidfunc fptr;
fptr = find_ptr("quux", name_list, (void **)ptr_list,
sizeof(ptr_list) / sizeof(ptr_list[0]));
fptr();
return 0;
}
除了不使用-Wpedantic 编译或复制我的find_ptr 函数,一次用于函数指针,一次用于非函数指针之外,有什么方法可以修复警告?有没有更好的方法来实现我想要做的事情?
【问题讨论】:
-
IIRC 的问题是代码指针的大小不一定与数据指针的大小相同。在大多数架构中它们都是。我将把它留给其他人来查找对 C 标准的参考。您可以通过
uintptr_t和返回来获得您想要的结果。 -
由于@abligh 提到的可能的大小不匹配,将函数指针转换为其他指针类型是未定义的行为有关更多详细信息,请参阅此问题:stackoverflow.com/questions/13696918/…
-
是什么阻止您将
void *ptrs[]替换为voidfunc * ptrs? -
你试过数据指针和函数指针的联合吗?
-
由于您显然不想调用所选函数,而只是返回它,您想通过间接方式解决这个问题,可能传递一个索引数组,引用您所在数组的条目用于这种当前且无法解决的方法。
标签: c pointers function-pointers