C 从指针强制转换为不同大小的整数

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

简单的代码给了我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", (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*,则会导致类似的问题。”“什么问题?