Лучшая практика обработки приведения вниз из-за 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;
}

person BarryE    schedule 18.06.2015    source источник
comment
Это не совсем красиво, но это, безусловно, кажется самым простым способом справиться с этим.   -  person Jerry Coffin    schedule 18.06.2015


Ответы (1)


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

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

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

    *pLong = (long)tmp64;

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

person funkysidd    schedule 18.09.2015