На самом деле это некритичный вопрос, но я получаю это предупреждение большую часть времени, когда использую указатели на функции, и до сих пор не могу понять, почему самостоятельно. Рассмотрим следующий прототип:
typedef void * Pointer;
void tree_destroyLineage(Tree greatest_parent, void *dataDestructor(Pointer data));
И пока я могу скомпилировать свой код длиной в тысячу строк и получить ноль предупреждений. Итак, я предполагаю, что написал декларацию правильно. Но затем я вызываю его в коде, передавая бесплатно в качестве деструктора, поскольку данные, хранящиеся в узлах дерева, представляют собой простые структуры:
tree_destroyLineage(decision_tree, free);
И это заставляет меня получить сообщение "warning: passing argument 2 of 'tree_destroyLineage' from incompatible pointer type"
. Моя первая гипотеза заключалась в том, что компилятор не мог понять во время компиляции, что Pointer
и void *
— это одно и то же, поэтому я попытался создать другую функцию с точно такими же типами указателя функции, который «повторно передает» вызов free()
и изменить объявление указателя функции принимает void *
вместо указателя. Оба подхода дали мне одно и то же предупреждение в одном и том же месте.
Что я делаю неправильно и как это решить?
void *
и приближают код к естественному языку. - person Humphrey Bogart   schedule 08.05.2009