C: указатель на функцию и проблема typedef

У меня есть функция 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» с помощью другой процедуры. Я не понимаю, почему у меня есть эти предупреждения.


person claf    schedule 05.04.2009    source источник


Ответы (3)


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

person Community    schedule 05.04.2009
comment
упс, я так и знал, что это какая-то глупость, все равно спасибо :) - person claf; 05.04.2009

Определение типа должно быть:

typedef void *(*my_destructor)(void *);
person Stephan202    schedule 05.04.2009

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

typedef void* (*my_destructor)(void *);
person Joao da Silva    schedule 05.04.2009