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

代码是:

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位,你会得到那个特别的警告。

你想做什么? 指针不是整数 ,并且您试图使指针超出01 ,具体取决于具体情况。 那是违法的。


如果您尝试将指针传递给包含01ABC ,请使用以下命令:

 ABC tmp = GetCar(i) == term_Null()? 0 : 1; Push(size, &tmp);