Зависимые определения в C - PullRequest
0 голосов
/ 03 января 2019

Предположим, у нас есть указатель функции на структуру, у которой сама структура является первым аргументом, типичный сценарий обратного вызова.

typedef void (*callback_type)(my_struct_type *mst, int whatever);

typedef struct {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;

Это приводит к ошибке компилятора в первом typedef, так какможно ожидать.error: unknown type name my_struct_type.Обращение определений приводит к тому же результату, но неизвестный тип - callback_type.

. Простое решение состоит в следующем:

typedef struct my_struct_type_S {
    // lots of fun stuff
    void (*notify_me)(my_struct_type_S *mst, int whatever);
} my_struct_type;

Однако при этом исключается тип указателя на функциюопределение, к которому было бы полезно иметь возможность легко ссылаться позже, и использовать для статических проверок типов, хороших сообщений об ошибках и т. д.

Есть предложения о том, как решить эту проблему?

Правитьon «возможный дубликат»: этот сценарий включает указатель на функцию typedefs, который загадочен для многих людей.Я думаю, что это хороший пример для этого случая, и, кроме того, принятый ответ очень чистый, ясный и простой.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вам необходимо определить тег структуры

typedef void (*callback_type)(struct _my_struct_type *mst, int whatever);

typedef struct _my_struct_type {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;
0 голосов
/ 03 января 2019

Вы можете сделать это, дав тегу struct и используя предварительное объявление структуры. Затем вы можете использовать typedef для указателя на функцию и впоследствии завершить определение структуры.

typedef struct my_struct_type_S my_struct_type;

typedef void (*callback_type)(my_struct_type *mst, int whatever);

struct my_struct_type_S {
    // lots of fun stuff
    callback_type notify_me;
};
...