2010-12-07 19 views
-1

CおよびC++では、任意の型のポインタをintに変換したいと考えています。コードはCとC++の両方で同じでなければなりません。次のプログラムはCでは動作しますが、C++では動作しません。Cでの明示的キャスト

int main(void) 
{ 
    long long a; 
    int b = (int)&a; 

    return 0; 
} 

C++でどのように動作させることができますか?

+0

C++はCと下位互換性があるため、Cで動作するものはC++で動作します。 – heavyd

+0

g ++ではコンパイルされません。私は言っておく必要があります、gccとg ++で動作するはずですか? –

+14

@heavyd:そうではありません。 –

答えて

6

あなたがoffsetofマクロをしたいように、それは<stddef.h>で定義されています検索します。

編集:例を変更しました。intptr_tまたはuintptr_tはです。どのような状況下でも、アドレスを平文に入れないでください。int

+0

移植性があり、すべてのコンパイラでサポートされていますか? –

+0

しかし、私はそれを_int_に入れたいと思います。とにかく、intptr_tは私に長いlong *を入れさせません。 –

+0

はい、 'offsetof'はC89とC++ 98(およびそれ以降のすべてのリビジョン)で指定されています。 – Jed

0

はもしかして:

struct X 
{ 
     char a; 
     long long b; 
}; 

int main(void) 
{ 
     int b[20]; 
     // C++ requires fixed size of arrays. 

     b[(int)(&((struct X*)0)->b) - 8] = 5; 
     // This will compile But what you get is not even worth guessing at. 

     return 0; 
} 
+0

ポインタから_int_への変換がある限り、これは問題ありません。しかし、私が書いたプログラムのためにそれを意味しました。 –

+0

@ user95281:あなたはコードを変更してそのことを知りませんでした。有効な変換がない場合でも、新しいコードがコンパイルされます。ポインタが64ビットで、intが32ビットの場合、それでもコンパイルは正常です。 –

関連する問題