chandrAN2& Ответов: 1

Функция определения типа проблемы составления указателя


Я пытаюсь объявить указатель функции с аргументом указателя структуры (который также является структурой typedefed), но во время компиляции я получаю ошибку ниже

"typedef' callback_fn_ptr ' инициализируется (вместо этого используйте decltype)
myStruct не был объявлен в этой области
ptr не был объявлен в этой области."


Вот мое заявление.

структура а
{
int Z;
};
typedef struct A myStruct;


void (*callback_fn_ptr)(myStruct *ptr);

В cpp-файл, функция, переменная-указатель создан, как показано ниже.

callback_fn_ptr my_fun_ptr;

Что я уже пробовал:

Когда я удаляю структуру typdef в нормальную структуру без typedef, то проблема не видна.

пустота (*callback_fn_ptr)(структуру a *ПТР); //никаких проблем при компиляции

может кто-нибудь помочь?

1 Ответов

Рейтинг:
2

Jochen Arndt

Мне не хватает одного typedef в вашем коде:

struct A
{
    int Z;
};
typedef struct A myStruct;
// Missing typedef here
//void (*callback_fn_ptr)(myStruct *ptr);
typedef void (*callback_fn_ptr)(myStruct *ptr);

// ...
callback_fn_ptr my_fun_ptr;


Однако вы также можете использовать typedef- вместо этого Эд структ:
typedef struct 
{
    int Z;
} myStruct;
typedef void (*callback_fn_ptr)(myStruct *ptr);

// ...
callback_fn_ptr my_fun_ptr;


Оба вышеприведенных фрагмента компилируются с помощью GCC.


chandrAN2&

Спасибо.. только с typedef я получил ошибку..я забыл добавить typedef, извините

typedef в пустоту (*callback_fn_ptr)(myStruct *ПТР); //ошибка "оператор typedef 'callback_fn_ptr' вместо инициализации (использовать decltype )
typdedef void (*callback_fn_ptr)(struct A *ptr); / / нет ошибки

chandrAN2&

Я не понимаю причины этой ошибки? Что означает эта ошибка?

Jochen Arndt

Хмм. Как я уже писал, я скомпилировал оба фрагмента из своего решения и не получил ошибки.

Я предположил, что ошибка была вызвана отсутствующим typedef для объявления вашей функции.

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

void (*callback_fn_ptr)(myStruct *ptr);

Это typedef (псевдоним), который будет использоваться позже с объявлениями и определениями:

typedef void (*callback_fn_ptr)(myStruct *ptr);