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 *);
У меня есть следующие вопросы:
-
- это следующий код равный?
typedef uint8_t EnrollT(uint16_t test1, uint16_t test2); typedef uint8_t (*EnrollT)(uint16_t test1, uint16_t test2);
-
В файле C, содержащем этот заголовок, как я могу обработать эти два аргумента в функции ClientAlloc? Пример кода будет мне очень полезен.
========================================================================
Спасибо за ответы. Имея две реальные функции, я передаю их в следующий код:
ClientAlloc(Enroll, Change)
Однако, когда я компилирую код, я получил следующие ошибки, есть ли что-нибудь, что я пропустил здесь?
expected declaration specifiers or ‘...’ before ‘Enroll’
expected declaration specifiers or ‘...’ before ‘NotifyChange’
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);