¿Por qué no puedo emitir un puntero de función a (void *)?

Tengo una función que toma una cadena, una matriz de cadenas y una matriz de punteros, y busca la cadena en la matriz de cadenas, y devuelve el puntero correspondiente de la matriz de punteros. Como uso esto para varias cosas diferentes, la matriz de punteros se declara como una matriz de (void *), y la persona que llama debe saber qué tipo de punteros están realmente allí (y, por lo tanto, qué tipo de puntero obtiene como valor de retorno )

Sin embargo, cuando paso una matriz de punteros de función, recibo una advertencia cuando compilo con-Wpedantic:

sonido metálico:

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,

Aquí hay un archivo de prueba, que a pesar de la advertencia imprime correctamente "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;
}

¿Hay alguna forma de arreglar la advertencia, aparte de no compilar con-Wpedantic, o duplicando mi función find_ptr, una vez para punteros de función y otra para punteros sin función? ¿Hay una mejor manera de lograr lo que estoy tratando de hacer?

Respuestas a la pregunta(6)

Su respuesta a la pregunta