2

Unix で問題なくコンパイルできる古い C プロジェクトがあります。Xcode on Lion でビルドしたいので、新しい Xcode プロジェクトを作成し、すべてのファイル (makefile を除く) を追加しました。

いずれにせよ、ビルド中に多くの「セマンティックの問題」に遭遇しています。ここで何が起こっているのか知っている人はいますか?ポインターに関するこれらの問題はすべて奇妙に思えます。Xcode でプロジェクトをビルドするのは、make を使用するのと本当に違うのでしょうか? これはosxと関係がありますか?

例えば:

unsigned char *p = b->buf + adbuf_used(b);

エラーが発生します:

タイプ 'char *' の式で 'unsigned char *' を初期化すると、ポインターが符号の異なる整数型に変換されます

printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));

エラーが発生します:

変換では型「int」が指定されていますが、引数の型は「unsigned」です

printf("%2d, ", p-cset);

エラーが発生します:

変換では型「int」が指定されていますが、引数の型は「long」です

if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 ) {

エラーが発生します:

型 'socklen_t *' (別名 'unsigned int *') のパラメーターに 'int *' を渡すと、ポインターが符号の異なる整数型に変換されます

4

2 に答える 2

3

このコンパイラはより厳密であり、定義上、正しいため、コンパイラからのエラーが表示されます。あなたが示した場合、あなたは以下を変えることができます:

  1. pb->buffは同じタイプではなく、タイプでpありunsigned char *b->buffタイプはchar *

    unsigned char *p = b->buf + adbuf_used(b);
    // To
    char *p = b->buf + adbuf_used(b);
    // or
    unsigned char *p = (unsigned char *)b->buf + adbuf_used(b);
    
  2. 符号なし整数のフォーマット指定子は%u、ではなく、%dです。または、コメントしたように、size_t使用の場合%zu

    printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
    // to
    printf("sizeof(unsigned int) = %zu\n", sizeof(unsigned int));
    
  3. longのフォーマット指定子は%ld、ではありません%d

    printf("%2d, ", p->cset);
    // to
    printf("%2ld, ", p->cset);
    
  4. 3番目のパラメーターはタイプsocklen_t *であり、int *

    if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 )
    //instead of 
    int len;
    // define
    socklen_t len;
    

これらのすべてのケースは、通常、そのままにしておいても害はありませんが、基本的unsignedsignedは異なるタイプでありlongint異なるタイプです(実際には多くのシステムで重要です)

于 2012-05-16T18:16:55.787 に答える
1

b->bufとの少なくとも 1 つはadbuf_used(b)、プレーンcharまたはsigned char.

の符号なし整数の指定子printfは ですu

指定子は、引数が type であるdと想定しますが、 (?) は typeです。代わりに使用してください。intp-csetlongl

これgetsocknameも同様の十分なエラーであり、自分で把握できます。

のマニュアルを読んでくださいprintf。そして、コンパイラの警告を尊重します。

于 2012-05-16T18:22:14.180 に答える