, даже если вы измените функцию на return int
(int (* fun c) ();) и в конечном итоге она скомпилируется, ваш код неверен.
Вызов указателя функции находится в факт разыменования этого указателя.
Когда вы назначаете указателю функции адрес структуры, вызов этой функции фактически выполнит данные внутри структуры, а не член структуры, на который ссылается функция. Это, конечно, не будет успешным.
https://godbolt.org/z/GE464T
Следующий пример представляет собой UB, но работает на машинах x86 и arm и только для иллюстративных целей ..
struct s{
int a, b;
int (**func)();
};
typedef struct{
int (*add)(int,int);
} Func;
int add(int a, int b) { return a+b; }
int main(){
Func f = {add};
struct s foo = {.func=(void*)(&f)};
printf("%i\n",f.add(1,2));
printf("%i\n",(*foo.func)(1,2));
}
https://godbolt.org/z/rKvGEG
или если вы хотите использовать указатель void (**)()
в структуре
typedef int func();
struct s{
int a, b;
void (**func)();
};
typedef struct{
int (*add)(int,int);
} Func;
int add(int a, int b) { return a+b; }
int main(){
Func f = {add};
struct s foo = {.func=(void*)(&f)};
printf("%i\n",f.add(1,2));
printf("%i\n",((func *)(*foo.func))(1,2));
}
https://godbolt.org/z/M9qzdf
или
typedef int func();
struct s{
int a, b;
void (*func)();
};
typedef struct{
int (*add)(int,int);
} Func;
int add(int a, int b) { return a+b; }
int main(){
Func f = {add};
struct s foo = {.func=(void*)(&f)};
printf("%i\n",f.add(1,2));
printf("%i\n",(*((func **)foo.func))(1,2));
}
или без typedefs
struct s{
int a, b;
void (*func)();
};
typedef struct{
int (*add)(int,int);
} Func;
int add(int a, int b) { return a+b; }
int main(){
Func f = {add};
struct s foo = {.func=(void*)(&f)};
printf("%i\n",f.add(1,2));
printf("%i\n",(*((int (**)())foo.func))(1,2));
}
https://godbolt.org/z/YG9xd7