У меня есть функция, которая берет строку, массив строк и массив указателей и ищет строку в массиве строк и возвращает соответствующий указатель из массива указателей. Поскольку я использую это для нескольких разных вещей, массив указателей объявляется как массив (void *), и вызывающий должен знать, какие именно указатели на самом деле есть (и, следовательно, какой указатель он возвращает в качестве возвращаемого значения).
Однако, когда я передаю массив указателей функций, я получаю предупреждение при компиляции с помощью -Wpedantic
:
лязг:
test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
between void pointer and function pointer [-Wpedantic]
НКА:
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, один раз для указателей на функции и один раз для не-указателей функций? Есть ли лучший способ достичь того, что я пытаюсь сделать?