これは実際には重要ではない質問ですが、ほとんどの場合、関数ポインターを使用してこの警告を受け取りますが、それでも自分で理由を理解できませんでした。次のプロトタイプを検討してください。
typedef void * Pointer;
void tree_destroyLineage(Tree greatest_parent, void *dataDestructor(Pointer data));
これまでのところ、1,000 行のコードをコンパイルしても、警告はゼロです。だから私は宣言を正しく書いたと仮定しています。しかし、ツリー ノードに格納されているデータは単純な構造体であるため、デストラクタとして free を渡してコードで呼び出します。
tree_destroyLineage(decision_tree, free);
そして、これは私に"warning: passing argument 2 of 'tree_destroyLineage' from incompatible pointer type"
メッセージを受け取ります。私の最初の仮説は、コンパイラーがコンパイル時にPointer
とvoid *
が同じものであることを理解できなかったというものでした。そのため、呼び出しを「再渡す」関数ポインターとまったく同じタイプの別の関数を作成し、関数ポインターをfree()
変更してみました。 void *
Pointer の代わりに aを受け入れる宣言。どちらのアプローチでも、まったく同じ場所でまったく同じ警告が表示されました。
私は何を間違っていますか、どうすれば解決できますか?