将指针投射到不同大小的整数
问题描述:
STRAIGHTFORWARD代码给我提供gcc警告"cast to pointer from integer of different size [-Wint-to-pointer-cast]"
。 这是否意味着STRAIGTHFORWARD剧组是非法的C?将指针投射到不同大小的整数
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void *thr(void *Arg)
{
#if STRAIGHTFORWARD
printf("i=%d\n", (int)Arg);
#else
printf("i=%d\n", (int)(intptr_t)Arg);
#endif
return 0;
}
int main()
{
pthread_t tids[4];
for(int i=0; i < sizeof tids/sizeof tids[0]; i++){
#if STRAIGHTFORWARD
pthread_create(tids+i, 0, thr, (void*)i);
#else
pthread_create(tids+i, 0, thr, (void*)(intptr_t)i);
#endif
}
pthread_exit(0);
}
答
这是否意味着STRAIGTHFORWARD投是非法的C 2
它是高度实现的定义,如果不是非法的。编译器试图警告你潜在的隐患。
引用C11
,§6.3.2.3
任何指针类型可以被转换为整数类型。除了以前指定的以外, 结果是实现定义的。如果结果不能用整数类型表示,则 的行为未定义。结果不需要在任何整数 类型的值的范围内。
这就是为什么intptr_t
和uintptr_t
在那里。
这就是说,(int)(intptr_t)Arg
也违背了目的,没有int
和intptr_t
之间的尺寸兼容性的保障,让剧组很容易出错,不亚于一个没有intptr_t
。
intptr_t在那里,因为我把它放在那里,因为它沉默了警告:D谢谢。 – PSkocik
建议明确添加OPs构造'(int)(intptr_t)Arg)'只沉默编译器警告,但如果'int'确实小于'void *'会导致类似的问题' –
当SO允许我。 – PSkocik