2015-06-18 9 views
2

я незащищенный метод, который принимает длинный * в качестве параметра, например так:Лучшая практика для обработки вниз бросает из-за C++ C2664 при компиляции 64 бит

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 не будет превышать пределы длинного?

Что-то вроде этого?

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

Это не совсем красиво, но это, безусловно, кажется самым простым способом справиться с этим. –

ответ

-1

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

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

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

*pLong = (long)tmp64; 

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