代码是:
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;
特定警告的原因是什么?
答案 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)
你想做什么? 指针不是整数,并且您尝试根据具体情况制作指针0
或1
。这是非法的。
如果您尝试将指针传递给包含ABC
或0
的{{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位,你得到那个特别的警告。