我有一个函数,它接受一个字符串,一个字符串数组和一个指针数组,然后查找字符串数组中的字符串,并从指针数组中返回相应的指针。由于我使用了这种方法来处理几个不同的事情,所以指针数组被声明为(void *)的一个数组,并且调用者应该知道实际存在的指针类型(以及它返回的返回值是什么类型的指针)。为什么我不能将函数指针转换为(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
由于@abligh提到可能的大小不匹配,因此它是未定义的行为,可以将函数指针转换为其他指针类型。有关更多详细信息,请参阅此问题:http://stackoverflow.com/questions/13696918/c-cast-void-pointer-to函数指针 – erdeszt
什么让你不能用'voidfunc * ptrs'来代替'void * ptrs []'? – alk