Tengo la siguiente estructura constante que contiene punteros de función:
/* module1.h */ typedef struct my_struct my_struct_t; struct my_struct { void (*funcPtr1)(void); void (*funcPtr2)(void); } extern const my_struct_t myStruct1; /* module1.c */ #include <module1.h> static void func1(void) { // do something } static void func2(void) { // do something else } const my_struct_t myStruct1 = { .funcPtr1 = &func1, .funcPtr2 = &func2 }¡Hasta aquí todo bien!
Ahora quiero crear una matriz constante de la estructura anterior y asignar los punteros de función de las instancias de la estructura:
/* module2.c */ #include <module1.h> const my_struct_t arrayOfMyStruct[] = { { myStruct1.funcPtr1, myStruct1.funcPtr2 }, // ... } El compilador arroja un error y dice que las expresiones "myStruct1.funcPtr1" y "myStruct1.funcPtr2" no eran constantes.
¿Lo que está mal?
myStruct1 se declara con el calificador const, pero no es constante. La inicialización estática requiere que lo sea, y arrayOfMyStruct tiene una duración de almacenamiento estática.
Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estático o de subprocesos serán expresiones constantes o literales de cadena.
Puede inicializarlo usando las funciones directamente: { func1, func2 },
o tome la dirección del puntero: { &myStruct1.funcPtr1, &myStruct1.funcPtr2 },
en cuyo caso tendrá que usar un tipo de estructura diferente para la matriz:
typedef struct { void (*const *funcPtr1)(void); void (*const *funcPtr2)(void); } my_struct2_t;Y la sintaxis para llamar a la función debe cambiarse:
(*arrayOfMyStruct[0].funcPtr2)();