将指针投射到不同大小的整数

问题描述:

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_tuintptr_t在那里。

这就是说,(int)(intptr_t)Arg也违背了目的,没有intintptr_t之间的尺寸兼容性的保障,让剧组很容易出错,不亚于一个没有intptr_t

+0

intptr_t在那里,因为我把它放在那里,因为它沉默了警告:D谢谢。 – PSkocik

+0

建议明确添加OPs构造'(int)(intptr_t)Arg)'只沉默编译器警告,但如果'int'确实小于'void *'会导致类似的问题' –

+0

当SO允许我。 – PSkocik