9

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

           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

4 に答える 4

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

于 2011-04-18T13:06:32.563 に答える
0

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

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

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

これは違法です。

于 2011-04-18T10:27:47.107 に答える
0

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


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

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);
于 2011-04-18T10:26:11.110 に答える
0

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

于 2011-04-18T10:31:16.420 に答える