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);
}
答案 0 :(得分:4)
这是否意味着STRAIGTHFORWARD演员是非法的C?
如果不是非法的话,它是高度实施的。编译器试图警告你潜在的陷阱。
引用C11
,§6.3.2.3
任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
这就是intptr_t
和uintptr_t
的原因。
尽管如此,(int)(intptr_t)Arg
也失败了目的,int
和intptr_t
之间无法保证大小兼容性,因此演员阵容容易出错,而且没有{{1} }}