2017-12-21 49 views
1

から初期のコンテキストを取得するコンパイルすると、私はこのエラーにかなりの数回実行しました:互換性のないポインタ型

gcc -o index.o -c -D_FILE_OFFSET_BITS=64 "-D FUSE_USE_VERSION=31" index.c 
index.c:40:12: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] 
    .write = o_write, 
      ^~~~~~~ 

をヒューズのドキュメントが矛盾してスパースになる傾向があるので、私は左探しています適切なメソッドの署名を見つけるために、GitHub上の他のファイルシステムの実装を参照してください。

はこの場合、私の問題があった。

私はこの警告が表示されたら、知るための簡単な方法があります:

int o_write(const char*, char*, size_t, off_t, struct fuse_file_info*); 

int o_write(const char*, const char*, size_t, off_t, struct fuse_file_info*); 

私の質問はされている必要がありますポインタの種類はとするととなりますか? a proper implementation in sshfsを追跡するのにかなり時間を費やしましたが、より簡単な方法があるように感じます。

+0

「書き込み」のタイプを調べることができます –

+0

この[スレッド](https://gcc.gnu.org/ml/gcc-help/2002-10/msg00149.html)では、 'const'キーワードについては言及していませんが、説明はポインタにも当てはまります –

+1

gccはこれらの警告に対しては無用です。 gcc _knows_予想されるどのタイプで、どのタイプを渡しましたか。プログラマに知らせるのは面倒ではありません。 – Lundin

答えて

3

これはあなたが表示されたエラーメッセージ再現多かれ少なかれMCVE(Minimal, Complete, Verifiable Example)である:示されたコードを含むファイルfuse37.cはMacOSのを実行しているMac上で(GCC 7.2.0でコンパイルされた場合

#include <sys/types.h>  // size_t, off_t 

struct fuse_file_info; 

struct whatever 
{ 
    int (*write)(const char*, const char*, size_t, off_t, struct fuse_file_info*); 
}; 

extern int o_wrong(const char*, char*, size_t, off_t, struct fuse_file_info*); 
extern int o_write(const char*, const char*, size_t, off_t, struct fuse_file_info*); 

struct whatever v1 = { .write = o_wrong }; 
struct whatever v2 = { .write = o_write }; 

をハイシエラ10.13.2)、私が取得:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c fuse37.c 
fuse37.c:13:33: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types] 
struct whatever v1 = { .write = o_wrong }; 
           ^~~~~~~ 
fuse37.c:13:33: note: (near initialization for ‘v1.write’) 
cc1: all warnings being treated as errors 
$ 

「注意」行中の補助情報を使用して、構造式のwriteメンバー(の定義を探すために必要なことを示しています210)。

あなたが関数呼び出しに間違った型の引数を渡すときに、あなたはより良いメッセージを取得:

$ cat fuse47.c 
    struct gizmotron; 
    struct megatron; 

    extern void calumniator(struct gizmotron *ptr); 
    extern void transformer(struct megatron *arg); 

    void calumniator(struct gizmotron *ptr) 
    { 
     transformer(ptr); 
    } 
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -c fuse47.c 
fuse47.c: In function ‘calumniator’: 
fuse47.c:9:17: error: passing argument 1 of ‘transformer’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    transformer(ptr); 
       ^~~ 
fuse47.c:5:13: note: expected ‘struct megatron *’ but argument is of type ‘struct gizmotron *’ 
extern void transformer(struct megatron *arg); 
      ^~~~~~~~~~~ 
cc1: all warnings being treated as errors 
$ 

は今、あなたはノートが期待されるタイプと受信タイプについて明示的であることがわかります。私は、(関数呼び出しとは対照的に)初期化時に余分な情報がないかどうかは、意図的であるか監督であるかは不明です。 1つの診断が可能であるので、もう1つの診断も可能でなければならない。これがアップグレードできるかどうかについては、GCCメンテナンスチームに問い合わせる価値があるかもしれません。

+0

これは本当にgccの非常に厄介な動作です。私はあまりにもgccのいくつかの意味のある診断を吐き出させるために、そのようなダミー関数を書いています。私はそれをやめてしまった - 私は他のCコンパイラでコードをコンパイルし、gccができなかったので、間違っているタイプを教えてもらう。 – Lundin

+0

ありがとう!関数を呼び出すことはトリックを行うように見えます! – retrohacker

関連する問題