2

次のようなパラメーターとして long* を受け入れる公開メソッドがあります。

void  MyClass::MyPublicMethod(long *pLong) 

このメソッド内で、次のように INT64* を受け入れるシステム API を呼び出します。

void  MyClass::MyPublicMethod(long *pLong) 
{
    //SomeAPI::APIMethod(INT64* p64);
    SomeAPI::APIMethod(&pLong);
}

x64としてコンパイルすると、エラーが発生します(当然のことです):

error C2664: 'SomeAPI::APIMethod(int64* p64)': cannot convert argument 1 from 'long*' to 'INT64*'

公開されたメソッドの署名を変更したくありません。下流に多くの影響を与えるからです。p64 が long の制限を超えないことがわかっている場合、この状況に対処する最善の方法は何ですか?

このようなもの?

void  MyClass::MyPublicMethod(long *pLong) 
{
    // Use a local INT64 for the API call.
    INT64 tmp64 = *pLong;
    //SomeAPI::APIMethod(INT64* p64);
    SomeAPI::APIMethod(&tmp64);
    *pLong = (long)tmp64;
}
4

1 に答える 1

-1

あなたが見ているのは、sizeof(long)あなたがテストしているプラ​​ットフォーム (Windows だと思います) が 32 ビット (64 ビットではなく) であるという事実の表れだと思います。その前提をテストしてみることができます。

その場合は、long long64 ビットである必要があるものを渡すことができます。次に、メソッド シグネチャを変更する必要があります。

ちなみに、これを書くときは、

    *pLong = (long)tmp64;

64 ビット値を 32 ビット値に型キャストしています。APIMethodが常に 32 ビット値を返すという保証はありますか。そうでなければ、それは問題です。

于 2015-09-18T05:42:31.540 に答える