Компиляция gsoap для x64 с помощью Visual Studio: преобразование C4302: усечение из void * в unsigned int - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь скомпилировать gsoap с VS 2017 для x64. Есть предупреждение компилятора, потому что void* (64-битный адрес) приводится к unsigned int (32-битное целое число). Это происходит в h = soap_hash_ptr(p), где p - void*, а h - unsigned int.

Это выглядит критически - поэтому я посмотрел stdsoap2.cpp текущей версии gsoap - там, однако, soap_hash_ptr, кажется, делает то же самое через PtrToUlong - я хочу сохранить gsoap, что здорово - но могу ли я все же положитесь - возможно, да, потому что возвращаемое значение soap_hash_ptr используется в качестве индекса для массива или вектора (либо soap->mht, либо soap->pht) - однако я еще не совсем уверен - может кто-нибудь дать мне подсказку? Спасибо.

  • IDE: VS2017
  • Цель: x64
  • версия gsoap: Приблизительно год 2005

1 Ответ

0 голосов
/ 18 ноября 2018

PtrToUlong правильно используется для усечения указателя, поскольку это на самом деле рекомендуется правилами Win64 для использования указателей https://docs.microsoft.com/en-us/windows/desktop/winprog64/rules-for-using-pointers

Используйте функцию PtrToLong или PtrToUlong для усечения указателей.

Если вам необходимо усечь указатель до 32-разрядного значения, используйте функцию PtrToLong или PtrToUlong (определено в Basetsd.h).Эти функции отключают предупреждение об усечении указателя на время вызова.

Макрос soap_hash_ptr, который вы цитируете, используется для вычисления индекса в хэш-таблице:

#if defined(WIN32) && !defined(UNDER_CE)
#define soap_hash_ptr(p)        ((PtrToUlong(p) >> 3) & (SOAP_PTRHASH - 1))
#else
#define soap_hash_ptr(p)        ((size_t)(((unsigned long)(p) >> 3) & (SOAP_PTRHASH-1)))
#endif

Это определение и его использование для индексации таблицы не может вызвать проблемы.

...