CおよびC++では、任意の型のポインタをintに変換したいと考えています。コードはCとC++の両方で同じでなければなりません。次のプログラムはCでは動作しますが、C++では動作しません。Cでの明示的キャスト
int main(void)
{
long long a;
int b = (int)&a;
return 0;
}
C++でどのように動作させることができますか?
CおよびC++では、任意の型のポインタをintに変換したいと考えています。コードはCとC++の両方で同じでなければなりません。次のプログラムはCでは動作しますが、C++では動作しません。Cでの明示的キャスト
int main(void)
{
long long a;
int b = (int)&a;
return 0;
}
C++でどのように動作させることができますか?
あなたがoffsetof
マクロをしたいように、それは<stddef.h>
で定義されています検索します。
編集:例を変更しました。intptr_t
またはuintptr_t
はです。どのような状況下でも、アドレスを平文に入れないでください。int
移植性があり、すべてのコンパイラでサポートされていますか? –
しかし、私はそれを_int_に入れたいと思います。とにかく、intptr_tは私に長いlong *を入れさせません。 –
はい、 'offsetof'はC89とC++ 98(およびそれ以降のすべてのリビジョン)で指定されています。 – Jed
はもしかして:
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;
}
ポインタから_int_への変換がある限り、これは問題ありません。しかし、私が書いたプログラムのためにそれを意味しました。 –
@ user95281:あなたはコードを変更してそのことを知りませんでした。有効な変換がない場合でも、新しいコードがコンパイルされます。ポインタが64ビットで、intが32ビットの場合、それでもコンパイルは正常です。 –
C++はCと下位互換性があるため、Cで動作するものはC++で動作します。 – heavyd
g ++ではコンパイルされません。私は言っておく必要があります、gccとg ++で動作するはずですか? –
@heavyd:そうではありません。 –