1

int(またはunsigned int)へのポインターをキャストしようとしていますが、何を試しても機能しません。

、、およびCスタイルのキャスト、's、 ' sのさまざまな組み合わせを試しましたがstatic_cast<intptr_t>(obj)、stdint.hを含めています。私が読んだことから、私が試した多くのことの1つはうまくいくはずです。何が得られますか?reinterpret_cast<intptr_t>(obj)intptr_tunsigned int

私が説明したとおりのコードであるため、わざわざコードを含めることはしませんでしたが、あなたが尋ねたので、これらすべてに加えて他の組み合わせを試しました。

void myfunc(Foo* obj)
{
    // ...
    uintptr_t temp = reinterpret_cast<uintptr_t>(obj);
    uintptr_t temp = static_cast<uintptr_t>(obj);
    uintptr_t temp = (uintptr_t)obj;
    intptr_t temp = reinterpret_cast<intptr_t>(obj);
    intptr_t temp = static_cast<intptr_t>(obj);
    intptr_t temp = (intptr_t)obj;
    unsigned int temp = reinterpret_cast<unsigned int>(obj);
    unsigned int temp = static_cast<unsigned int>(obj);
    unsigned int temp = (unsigned int)obj;
    // ...
}

それらはすべてまったく同じエラーを出します。

4

2 に答える 2

6

sizeof (Foo*) > sizeof (unsigned)、またはコンパイラが移植性のないコードについて警告するように設定されているプラ​​ットフォームを使用しています。LP64とLLP64の両方のほとんどの64ビットコンパイラは、このカテゴリに分類されることに注意してください。

ポインタがに収まる必要はありませんint。それがの要点ですintptr_t

callbacls中にユーザーコンテキストのみを提供するサードパーティライブラリを使用している場合はint、ルックアップテーブルにインデックスを渡すことができるため、ポインタ自体がルックアップテーブルに格納されます。これには、タイプセーフであり、エイリアシングの仮定を破らないという追加の利点があります。

編集:私のために働きます。(Comeauの「tryitout」はとても便利です)

#include <stdint.h>

void myfunc(class Foo* obj)
{
    uintptr_t temp = reinterpret_cast<uintptr_t>(obj);
}

ONLINE_EVALUATION_BETA2のComeauC/ C ++ 4.3.10.1(2008年10月6日11:28:09)Copyright 1988-2008ComeauComputing。全著作権所有。MODE:厳密なエラーC ++ C ++ 0x_extensions

"ComeauTest.c"、5行目:警告:変数 "temp"が宣言されましたが、参照されませんでしたuintptr_t temp = reinterpret_cast(obj); reinterpret_cast(obj);

strictモードでは、-tusedを使用して、コンパイルが成功しました(ただし、Comeauオンラインコンパイラはリンクしないことに注意してください)。C++0x拡張機能を有効にしてコンパイル。

C89モードでは、次のようにも機能します。

#include <stdint.h>

void myfunc(struct Foo* obj)
{
    uintptr_t temp = (uintptr_t)obj;
}

ONLINE_EVALUATION_BETA2のComeauC/ C ++ 4.3.10.1(2008年10月6日11:28:09)Copyright 1988-2008ComeauComputing。全著作権所有。モード:厳密なエラーC90

"ComeauTest.c"、3行目:警告:宣言は関数の外では表示されませんvoid myfunc(struct Foo * obj)^

"ComeauTest.c"、5行目:警告:変数 "temp"が宣言されましたが、参照されていませんuintptr_t temp =(uintptr_t)obj; ^

strictモードでは、-tusedを使用して、コンパイルが成功しました(ただし、Comeauオンラインコンパイラはリンクしないことに注意してください)。

于 2010-10-09T22:38:53.600 に答える
1

もちろん、明示的なキャストによって型変換をマスターすることをお勧めします。そして、前の答えはそれをよく言います。

しかし、コンパイラをバイパスすることをお勧めします。コンパイラに現在の精度の低下を受け入れさせるオプションがあります。

gcc -fpermissive
于 2019-04-30T15:45:18.933 に答える