gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:21:20 24 4
gpt4 key购买 nike

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

无论如何,我在构建时遇到了许多“语义问题”。有谁知道这里会发生什么?指针的所有这些问题似乎很奇怪。在 Xcode 中构建项目与使用 make 真的有什么不同吗?这与osx有关吗?

例如:

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

给出错误:

Initializing 'unsigned char *' with an expression of type 'char *' converts between pointers to integer types with different sign




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

给出错误:

Conversion specifies type 'int' but the argument has type 'unsigned




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

给出错误:

Conversion specifies type 'int' but the argument has type 'long'




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

给出错误:

Passing 'int *' to parameter of type 'socklen_t *' (aka 'unsigned int *') converts between pointers to integer types with different sign

最佳答案

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

  • pb->buff不是同一类型,punsigned char * 类型, 而 b->buffchar * 类型
    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
    printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
    // to
    printf("sizeof(unsigned int) = %zu\n", sizeof(unsigned int));
  • long 的格式说明符是 %ld ,而不是 %d
    printf("%2d, ", p->cset);
    // to
    printf("%2ld, ", p->cset);
  • 第三个参数的类型为 socklen_t * ,而不是 int *
    if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 )
    //instead of
    int len;
    // define
    socklen_t len;

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

    关于c - 在 Xcode 中构建旧的 unix C 项目时出现错误的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624254/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com