Получение предупреждения «приведение к указателю из целого числа другого размера» из следующего кода - PullRequest
9 голосов
/ 18 апреля 2011

Код:

           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 ]

21 голосов
/ 18 апреля 2011

Вы можете использовать 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

0 голосов
/ 18 апреля 2011

Вы пытаетесь привести целочисленное значение (0 или 1) к пустому указателю.

Это выражение всегда целое число со значением 0 или 1: (GetCar(i) == term_Null()? 0 : 1)

И вы пытаетесь привести его к пустому указателю (POINTER) (typedef void * POINTER).

Что незаконно.

0 голосов
/ 18 апреля 2011

Поскольку в этом вопросе используются те же typedef, что и в вашем вопросе о переносе с 32-битного на 64-битный, я предполагаю, что вы используете 64-битные указатели. Как писал MByd, вы приводите int к указателю, и, поскольку int не является 64-битным, вы получаете именно это предупреждение.

0 голосов
/ 18 апреля 2011

Что вы пытаетесь сделать? Указатели не являются целыми числами , и вы пытаетесь сделать указатель из 0 или 1, в зависимости от ситуации. Это незаконно.


Если вы пытались передать указатель на ABC, содержащий 0 или 1, используйте это:

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