C-функция typedef, используемая в качестве указателя в аргументе другой функции [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть заголовочный файл, определяющий некоторый код, показанный ниже:

typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef void ChangeT(uint64_t post1, uint8_t post2);

struct ClusterT * ClientAlloc(EnrollT *, ChangeT *);

У меня есть следующие вопросы:

  1. - это следующий код равный?

    typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
    typedef uint8_t (*EnrollT)(uint16_t test1, uint16_t test2);
    
  2. В файле C, содержащем этот заголовок, как я могу обработать эти два аргумента в функции ClientAlloc? Пример кода будет мне очень полезен.

========================================================================

Спасибо за ответы. Имея две реальные функции, я передаю их в следующий код:

ClientAlloc(Enroll, Change)

Однако, когда я компилирую код, я получил следующие ошибки, есть ли что-нибудь, что я пропустил здесь?

expected declaration specifiers or ‘...’ before ‘Enroll’
expected declaration specifiers or ‘...’ before ‘NotifyChange’
2   3  

2 ответа:

Нет, это не так.

typedef uint8_t (*PEnrollT)(uint16_t test1, uint16_t test2);

Определяет тип указателя функции, соответствующий этой сигнатуре. Итак,

uint8_t EnrollT(uint16_t test1, uint16_t test2);

Совпадает с этой подписью и вы можете использовать как: PEnrollT pfn = EnrollT; и использовать в качестве pfn(....); / / эквивалентно вызову EnrollT

Теперь у вас есть

typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef void ChangeT(uint64_t post1, uint8_t post2);

Итак, у вас есть функция типа EnrollT is "с двумя параметрами uint16_t, возвращающими uinit8_t. Кроме того, у вас есть,

struct ClusterT * ClientAlloc(EnrollT *, ChangeT *);

Итак, если у вас есть две функции, соответствующие EnrollT, ChangeT, вы можете вызвать ClientAlloc передача тезисов двух функций

Обращаясь ко второму вопросу:

Вы должны создать две функции с сигнатурой, определенной EnrollT и ChangeT (но вы не можете использовать типы EnrollT и ChangeT по имени):

uint8_t enroll(uint16_t test1, uint16_t test2){ ... };
void change(uint64_t post1, uint8_t post2){ ... };

И затем передать их вызову функции:

ClientAlloc(enroll, change);