我有一个旧的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 *')在指向具有不同符号
的整数类型的指针之间进行转换
答案 0 :(得分:3)
显示编译器的错误,因为这个编译器更严格,根据定义,它是正确的。在您展示的案例中,您可以更改以下内容:
p
和b->buff
的类型不同,p
的类型为unsigned char *
,而b->buff
的类型为{{1} }}
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);
,而不是%u
。或者,如评论所述,在%d
使用size_t
%zu
long的格式说明符为printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
// to
printf("sizeof(unsigned int) = %zu\n", sizeof(unsigned int));
,而不是%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;
和unsigned
是不同的类型,signed
和long
是不同的类型(它在很多系统中都很重要)
答案 1 :(得分:1)
b->buf
和adbuf_used(b)
中至少有一个是普通char
或signed char
。
printf
中无符号整数的说明符为u
。
说明符d
假定参数的类型为int
,而p-cset
(?)的类型为long
。请改用l
。
getsockname
又是一个类似的错误,您可以自己弄明白。
阅读printf
的手册。并尊重编译器警告。