次のコードから「異なるサイズの整数からポインタにキャストする」という警告を取得する

2011年04月18日に質問されました。  ·  閲覧回数 21.9k回  ·  ソース

thetna picture
2011年04月18日

コードは次のとおりです。

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

これが C code pushABCを返すことです。

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

特定の警告の理由は何ですか?

回答

anatolyg picture
2011年04月18日
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

orlp picture
2011年04月18日
0

あなたは何をしようとしているのですか? ポインタは整数0または1からポインタを作成しようとしています。 それは違法です。


0または1を含む0 ABCへのポインタを渡そうとした場合は、次を使用します。

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);
MByD picture
2011年04月18日
0

整数値(0または1)をvoidポインターにキャストしようとしています。

この式は常に値0または1のintです: (GetCar(i) == term_Null()? 0 : 1)

そして、それをvoidポインター(POINTER)typedef void * POINTER )にキャストしてみます。

これは違法です。

Bob Prystanek picture
2011年04月18日
0

この質問は32ビットから64ビットへの移植の質問と同じtypedefを使用しているので、64ビットのポインターを使用していると思います。 MBydが書いたように、intをポインターにキャストしていますが、intは64ビットではないため、その特定の警告が表示されます。