Как мне объявить функцию, которая возвращает указатель на функцию? - PullRequest
4 голосов
/ 06 ноября 2011

Представьте себе функцию myFunctionA с параметром double и int:

myFunctionA (double, int);

Эта функция должна возвращать указатель на функцию:

char (*myPointer)();

Как мне объявить эту функцию в C?

Ответы [ 4 ]

12 голосов
/ 06 ноября 2011

typedef ваш друг:

typedef char (*func_ptr_type)();
func_ptr_type myFunction( double, int );
4 голосов
/ 06 ноября 2011
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;
    }
}
3 голосов
/ 06 ноября 2011

Сделайте typedef:

typedef int (*intfunc)(void);

int hello(void)
{
    return 1;
}

intfunc hello_generator(void)
{
    return hello;
}

int main(void)
{
    intfunc h = hello_generator();
    return h();
}
0 голосов
/ 06 ноября 2011
char * func() { return 's'; }

typedef char(*myPointer)();
myPointer myFunctionA (double, int){ /*Implementation*/ return &func; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...