C: указатель на функцию и проблема с typedef - PullRequest
9 голосов
/ 05 апреля 2009

У меня есть функция C, которая принимает указатель на функцию в качестве аргумента, это деструктор, который я вызову в конце моей программы. Вот прототип моей функции:

int store_dest(void (*routine)(void *));

Я хочу сохранить указатель на эту функцию в структуре вместе с другой информацией. Чтобы получить хорошую структуру, я хочу иметь typedef для этого указателя на функцию. Вот мой typedef:

typedef void (*my_destructor)(void *);

А вот моя структура:

typedef struct my_struct{
  my_destructor dest;
  other_info ...
} my_struct;

На этапе инициализации я хочу установить для поля «dest» мою функцию, вот прототип этой функции:

void* my_dummy_dest(void* foo);

Проблема (на самом деле это просто предупреждение, но я бы хотел его устранить) возникает, когда я пытаюсь установить поле "dest" в моей структуре на "my_dummy_dest":

my_struct.dest = &my_dummy_dest;

Я получаю «предупреждение: назначение из несовместимого типа указателя»

То же самое, когда я просто сравниваю их:

if (my_struct.dest == &my_dummy_dest)

Я получаю «предупреждение: при сравнении разных типов указателей отсутствует приведение»

Но я не получаю предупреждения, когда устанавливаю поле "dest" с помощью другой процедуры. Я не понимаю, почему у меня есть эти предупреждения.

Ответы [ 3 ]

11 голосов
/ 05 апреля 2009

Ваш фиктивный деструктор объявлен как возвращающий указатель void , а не void. Это объявление не соответствует typedef для вашего указателя функции деструктора.

5 голосов
/ 05 апреля 2009

Потому что my_dummy_test возвращает void * вместо пустоты. Если вы хотите вернуть void *, typedef должен быть

typedef void* (*my_destructor)(void *);
5 голосов
/ 05 апреля 2009

typedef должен быть:

typedef void *(*my_destructor)(void *);
...