C 从指针强制转换为不同大小的整数
简单的代码给了我gcc警告“从不同大小的整数转换为指针[-Wint到指针转换]”。 这是否意味着前卫投法是非法的C 从指针强制转换为不同大小的整数,c,casting,C,Casting,简单的代码给了我gcc警告“从不同大小的整数转换为指针[-Wint到指针转换]”。 这是否意味着前卫投法是非法的 #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
#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);
}
#包括
#包括
#包括
#包括
#包括
void*thr(void*Arg)
{
#直截了当
printf(“i=%d\n”,(int)Arg);
#否则
printf(“i=%d\n”,(int)(intptr_t)Arg);
#恩迪夫
返回0;
}
int main()
{
pthread_t tids[4];
对于(int i=0;i
这是否意味着前卫投法是非法的
#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);
}
它是高度实现定义的,如果不是非法的话。编译器试图警告您潜在的陷阱
引用C11
,§6.3.2.3
任何指针类型都可以转换为整数类型。除非之前另有规定,否则
结果是定义了实现。如果结果不能用整数类型表示,
该行为未定义。结果不必在任何整数的值范围内
类型
这就是为什么存在intptr\u t
和uintptr\u t
的原因
这就是说,
(int)(intptr\u t)Arg
也违背了目的,无法保证int
和intptr\u t
之间的大小兼容性,因此,强制转换与不带intptr\u t
的转换一样容易出错。intptr\u t在那里,因为我把它放在那里,因为它使警告静音:D谢谢。建议明确添加OPs构造(int)(intptr\u t)Arg)
仅使编译器警告静音,但是,如果int
确实小于void*
@FelixPalmen,那么会导致类似的问题。是的,可能更好,将添加@PSkocik,在您的特殊情况下,您知道此指针只包含int
,因此关闭警告是可以的。我仍然建议将指向某个对象的指针传递给线程,though@FelixPalmen“(int)(intptr_t)Arg)只会使编译器警告静音,但如果int真的小于void*,则会导致类似的问题。”“什么问题?