Есть ли «имя типа» для функций в C? - PullRequest
2 голосов
/ 16 мая 2019

В C можно определить указатель на функцию, но есть ли «имя типа» для того, на что указывает указатель?

Чтобы уточнить, можно вместо void (*fubar)(void) иметь определение типа, чтобы можно было объявить fubar как Frob* fubar?

Ответы [ 3 ]

6 голосов
/ 16 мая 2019

Стандартного имени типа для указателей функций не существует, как и для int. Кроме того, нет ключевого слова для именования тегов для них, как для struct. Вместо этого вы должны использовать typedef, если хотите сослаться на прототип функции или указатель на функцию по имени.

Рассмотрим следующее typedef:

typedef void Frob (void);

Без ключевого слова typedef объявление будет для прототипа функции с именем Frob. С typedef имя Frob теперь является псевдонимом типа для функций, соответствующих этому прототипу. Итак, его можно использовать так:

Frob foo;
Frob *fubar = foo;
void foo (void) { puts(__func__); }
int main (void) { fubar(); }

Как правило, typedef работает таким образом, когда он может превратить объявление переменной (sans initializer) в псевдоним типа.

1 голос
/ 16 мая 2019
typedef void (*fubar_p)(void);

или

void typedef (*fubar_p)(void);

или

typedef void (fubar)(void);

или

void typedef (fubar)(void);

тогда вы можете сделать

fubar_p fun_p;

или

fubar *fun;

В обоих случаях fun и fun_p имеют одинаковое значение, указатель на функцию не принимает параметров и ничего не возвращает.

0 голосов
/ 16 мая 2019

Просто введите его.

typedef void(*Frob)(void);

void f(void)
{
    // your code goes here
}

int main()
{
    Frob fubar = f;
    fubar();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...