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

时间:2017-05-25 07:02:34

标签: c casting

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);

}

1 个答案:

答案 0 :(得分:4)

  

这是否意味着STRAIGTHFORWARD演员是非法的C?

如果不是非法的话,它是高度实施的。编译器试图警告你潜在的陷阱。

引用C11,§6.3.2.3

  

任何指针类型都可以转换为整数类型。除非事先指明,否则   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果不必在任何整数的值范围内   类型。

这就是intptr_tuintptr_t的原因。

尽管如此,(int)(intptr_t)Arg也失败了目的,intintptr_t之间无法保证大小兼容性,因此演员阵容容易出错,而且没有{{1} }}