从以下代码获取警告“从不同大小的整数转换为指针”

时间:2011-04-18 10:20:35

标签: c gcc gcc-warning

代码是:

           Push(size, (POINTER)(GetCar(i) == term_Null()? 0 : 1));

以下 C code push返回ABC

 typedef POINTER  *ABC
 typedef void * POINTER
 ABC size;
 Push(ABC,POINTER);
 XYZ GetCar(int);
 typedef struct xyz *XYZ;
 XYZ term_Null(); 
 long int i;

特定警告的原因是什么?

4 个答案:

答案 0 :(得分:21)

您可以使用intptr_t确保整数与指针的宽度相同。这样,您就不需要发现有关特定平台的内容,它也可以在另一个平台上运行(与unsigned long解决方案不同)。

#include <stdint.h>

Push(size, (POINTER)(intptr_t)(GetCar(i) == term_Null()? 0 : 1));

取自C99标准:

  

7.18.1.4能够保存对象指针的整数类型

     

1   以下类型指定签名   具有该属性的整数类型   任何有效的指向void的指针都可以   转换为此类型,然后转换   回到指向void的指针,以及   结果将等于   原始指针:

     

使用intptr_t

答案 1 :(得分:0)

你想做什么? 指针不是整数,并且您尝试根据具体情况制作指针01。这是非法的。


如果您尝试将指针传递给包含ABC0的{​​{1}},请使用以下命令:

1

答案 2 :(得分:0)

您正在尝试将整数值(0或1)转换为void指针。

此表达式始终值为0或1的int:(GetCar(i) == term_Null()? 0 : 1)

您尝试将其强制转换为无效指针(POINTER)typedef void * POINTER)。

哪个是非法的。

答案 3 :(得分:0)

由于此问题使用与32位到64位移植问题相同的typedef,因此我假设您使用的是64位指针。正如MByd写的那样,你正在向一个指针投射一个int,因为int不是64位,你得到那个特别的警告。

相关问题