从以下代码获取警告“从不同大小的整数转换为指针”
代码是:
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;
特别警告的原因是什么?
您可以使用intptr_t
确保整数与指针具有相同的宽度。 这样,您不需要发现有关特定平台的内容,它也可以在另一个平台上运行(与unsigned long
解决方案不同)。
#include Push(size, (POINTER)(intptr_t)(GetCar(i) == term_Null()? 0 : 1));
取自C99标准:
7.18.1.4能够保存对象指针的整数类型
1以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:
使用intptr_t
您正在尝试将整数值(0或1)转换为void指针。
此表达式始终为值为0或1的int: (GetCar(i) == term_Null()? 0 : 1)
并尝试将其转换为void指针(POINTER)
( typedef void * POINTER
)。
哪个是非法的。
由于此问题使用与32位到64位移植问题相同的typedef,因此我假设您使用的是64位指针。 正如MByd所写的那样,你正在向指针投射一个int,因为int不是64位,你会得到那个特别的警告。
你想做什么? 指针不是整数 ,并且您试图使指针超出0
或1
,具体取决于具体情况。 那是违法的。
如果您尝试将指针传递给包含0
或1
的ABC
,请使用以下命令:
ABC tmp = GetCar(i) == term_Null()? 0 : 1; Push(size, &tmp);