これは実際には重要ではない質問ですが、私は関数ポインタを使用しているときにこの警告を受け取っていますが、Cで関数ポインタを使用するときの警告
typedef void * Pointer;
void tree_destroyLineage(Tree greatest_parent, void *dataDestructor(Pointer data));
これまでのところ、私は1000行のコードをコンパイルしてゼロの警告を得ることができました。だから私は正しく宣言を書いたと仮定しています。しかし、その後、ツリー・ノードに格納されたデータは、単純な構造体であるため、私は、私のデストラクタとして自由に渡し、コードでそれを呼び出す:
tree_destroyLineage(decision_tree, free);
そして、これは私が"warning: passing argument 2 of 'tree_destroyLineage' from incompatible pointer type"
メッセージを取得します。私の最初のhypotheisは、コンパイル時にPointer
とvoid *
が同じものであることを知ることができなかったので、全く同じタイプの別の関数を作成して、free()
への呼び出しを "再呼び出し"し、ポインタの代わりにvoid *
を受け入れる関数ポインタ宣言。どちらのアプローチもまったく同じ場所で私に同じような警告を与えました。
私は間違っていますが、どうすれば解決できますか?
ご利用には本当に愚かです。単にvoid *を使用してください。 – Zifre
私は本当に持っていない時間を使ってたくさんの既存のコードを変更しなければならないので、それはまだ変わっていないと言われました。また、一部の評価者はvoid *の使用に対して少し抵抗があるので、私はただ単に '透明性'を取り除いています。 また、GLIBの "gpointer"型はまったく同じもので、void *型のtypedefです。実際には、さらに進んで、 "const void *"に "gconstpointer"を定義します。また、少なくとも私のテストが示すように、これは問題を解決しません。 –
なぜそれは意味ですか?私はそれが愚かであるとは思わない...ポインタが 'void *'として実装され、コードを自然言語に近づけるという事実を隠す。 –