指针在Xcode中构建旧的unix C项目时出错?

时间:2012-05-16 18:12:04

标签: c xcode macos pointers

我有一个旧的C项目,在Unix中编译得很好。我想在Lion上的Xcode中构建它,所以我创建了一个新的Xcode项目并添加了所有文件(makefile除外)。

无论如何,我在构建时遇到了许多“语义问题”。有谁知道这里会发生什么?所有这些指针问题,似乎很奇怪。是否真的与使用make在Xcode中构建项目不同?这与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 ) {

给出错误:

  

将'int *'传递给'socklen_t *'类型的参数(又名'unsigned int   *')在指向具有不同符号

的整数类型的指针之间进行转换

2 个答案:

答案 0 :(得分:3)

显示编译器的错误,因为这个编译器更严格,根据定义,它是正确的。在您展示的案例中,您可以更改以下内容:

  1. pb->buff的类型不同,p的类型为unsigned char *,而b->buff的类型为{{1} }}

    char *
  2. 无符号整数的格式说明符为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); ,而不是%u。或者,如评论所述,在%d使用size_t

    的情况下
    %zu
  3. long的格式说明符为printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int)); // to printf("sizeof(unsigned int) = %zu\n", sizeof(unsigned int)); ,而不是%ld

    %d
  4. 第三个参数的类型为printf("%2d, ", p->cset); // to printf("%2ld, ", p->cset); ,而不是socklen_t *

    int *
  5. 如果保持原样,所有这些案例通常都不会造成伤害,但基本上if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 ) //instead of int len; // define socklen_t len; unsigned是不同的类型,signedlong是不同的类型(它在很多系统中都很重要)

答案 1 :(得分:1)

b->bufadbuf_used(b)中至少有一个是普通charsigned char

printf中无符号整数的说明符为u

说明符d假定参数的类型为int,而p-cset(?)的类型为long。请改用l

getsockname又是一个类似的错误,您可以自己弄明白。

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