void (*fun(double, int))();
Согласно правилу вправо-влево , fun
является функцией double, int
, возвращающей указатель на функцию с неопределенными параметрами, возвращающими void
.
РЕДАКТИРОВАТЬ: Этот является еще одной ссылкой на это правило.
РЕДАКТИРОВАТЬ 2: Эта версия предназначена только для компактности и показать, что это действительно может быть сделано.
Здесь действительно полезно использовать typedef. Но не на указатель, а на сам тип функции .
Почему? Потому что тогда можно использовать его как своего рода прототип и таким образом убедиться, что функции действительно совпадают. И потому, что личность в качестве указателя остается видимой.
Так что хорошим решением было бы
typedef char specialfunc();
specialfunc * myFunction( double, int );
specialfunc specfunc1; // this ensures that the next function remains untampered
char specfunc1() {
return 'A';
}
specialfunc specfunc2; // this ensures that the next function remains untampered
// here I obediently changed char to int -> compiler throws error thanks to the line above.
int specfunc2() {
return 'B';
}
specialfunc * myFunction( double value, int threshold)
{
if (value > threshold) {
return specfunc1;
} else {
return specfunc2;
}
}