2

我有一个在 Unix 中编译得很好的旧 C 项目。我想在 Lion 上的 Xcode 中构建它,所以我创建了一个新的 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”,但参数的类型为“无符号”

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

给出错误:

转换指定类型“int”,但参数的类型为“long”

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

给出错误:

将“int *”传递给“socklen_t *”(又名“unsigned int *”)类型的参数会在指向具有不同符号的整数类型的指针之间进行转换

4

2 回答 2

3

显示编译器的错误是因为此编译器更严格,并且根据定义,它是正确的。在您展示的情况下,您可以更改以下内容:

  1. pandb->buff不属于同一类型,p属于 type unsigned char *,而b->buff属于 typechar *

    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, not %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, not%d

    printf("%2d, ", p->cset);
    // to
    printf("%2ld, ", p->cset);
    
  4. 第三个参数是 type socklen_t *,不是int *

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

如果保持原样,所有这些情况通常不会造成伤害,但基本上unsignedsigned是不同的类型,long并且int是不同的类型(这在许多系统中实际上很重要)

于 2012-05-16T18:16:55.787 回答
1

b->buf和中的至少一个adbuf_used(b)是普通char的或signed char.

中无符号整数的说明符printfu

说明符d假定参数是 typeintp-cset(?) 是 type long。改为使用l

getsockname又是一个足够相似的错误,您可以自己弄清楚。

阅读手册printf。并尊重编译器警告。

于 2012-05-16T18:22:14.180 回答