Я написал простую демонстрацию (test.cpp) для моего вопроса:
#include <stdio.h>
typedef void* (*SEL)(void);
int foo(int a, int b, int c) {
return a + b + c;
}
SEL _ptr_to_foo() {
return (SEL)foo;
}
int main() {
SEL sel = _ptr_to_foo();
return 0;
}
и я скомпилировал его с g++ test.cpp -o test
в моем osx и компиляторы ничего не жаловали.
Но я не понимаю, что здесь произошло. На мой взгляд, SEL
определяет указатель на функцию, параметром которой является void
и возвращает void*
. Однако функция foo
должна быть функцией, которая принимает три параметра типа int и возвращает int в качестве результата. Я думаю, что указатель на функцию foo
должен быть объявлен как int (*ptr)(int, int, int) = foo;
. Почему кастинг в _ptr_to_foo
работает? Что здесь произошло?