указатели — Лучшая практика для обработки бросков из-за C ++ C2664 при компиляции 64 бит

У меня есть метод, который принимает long * в качестве параметра, как это:

void  MyClass::MyPublicMethod(long *pLong)

Внутри этого метода я вызываю системный API, который принимает INT64 *, например:

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;
}

2

Решение

Я думаю, то, что вы видите, является проявлением того факта, что sizeof(long) на платформе, которую вы тестируете, я предполагаю, что это Windows, 32-битная (в отличие от 64). Вы можете попробовать проверить это предположение.

Если это правда, вы можете перейти в long long который должен быть 64 бит. Затем вам придется изменить сигнатуру метода.

Как примечание, когда вы пишете это,

    *pLong = (long)tmp64;

Вы вводите 64-битное значение в 32-битное. Есть ли гарантия, что APIMethod всегда возвращает 32-битное значение. Если нет, то это проблема.

-1

Другие решения


По вопросам рекламы [email protected]