Это на самом деле некритический вопрос, но я получаю это предупреждение большую часть времени, когда использую указатели функций и до сих пор не могу понять почему самостоятельно. Рассмотрим следующий прототип:
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 *
вместо указателя. Оба подхода дали мне одно и то же предупреждение в одном и том же месте.
Что я делаю не так и как мне это решить?