Я портирую приложение с 32 бит на 64 бит.Приложение включает в себя сгенерированный gSoap исходный код ANSI C.Прототипы нескольких функций мыла включают int типы данных в списке аргументов, такие как:
int PASCAL FAR setsockopt (
__in SOCKET s,
__in int level,
__in int optname,
__in_bcount_opt(optlen) const char FAR * optval,
__in int optlen);
Но при вызове в stdsoap2.c 5-йаргумент в этом примере передается оператору sizeof:
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
{ ...
}
Оператор sizeof возвращает значение типа size_t , которое является просто без знака int .При компиляции в 32-битной среде это не представляет никаких проблем, однако при компиляции в 64-битной среде предупреждение: «Преобразование из« unsigned __int64 »в« int »может привести к потере данных» .
Я понимаю проблему потери данных, мой вопрос , где и как было бы лучше всего в коде решить проблему, исключая приведение типа (int) при каждом появленииоператор sizeof передается как int в stdsoap2.c (только в stdsoap.c есть 32 предупреждения).Я хотел бы избежать редактирования автоматически сгенерированного исходного файла, если это возможно.
Для тех, кто знаком с методами gsoap, я включил следующее:
#ifdef WITH_SOAPDEFS_H
# include "soapdefs.h" /* include user-defined stuff */
#endif
и использую soapdefs.h в своем проекте.Этот файл имеет широкий охват проекта, возможно, этот файл будет хорошим , где для решения проблемы, тогда вопрос будет просто how ?
Спасибо, Ryyker