我正在将应用程序从 32 位移植到 64 位。该应用程序包括 gSoap 生成的 ANSI C 源代码。几个生成的soap函数的原型包括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
只是一个unsigned int
. 在 32 位环境下编译时,这没有问题,但是在 64 位环境下编译时,警告: “从 unsigned __int64
to转换 int
可能会丢失数据”。
我了解数据丢失问题。我的问题是它应该在哪里以及如何放置在代码中,以解决作为内部传递(int)
的每个宏的类型转换不足的问题(单独有 32 个警告)。如果可能,我想避免编辑自动生成的源文件。sizeof
int
stdsoap2.c
stdsoap.c
对于那些熟悉gsoap
方法的人,我包括以下内容:
#ifdef WITH_SOAPDEFS_H
# include "soapdefs.h" /* include user-defined stuff */
#endif
并soapdefs.h
在我的项目中使用。这个文件的项目范围很广,也许这个文件是解决问题的好地方,那么问题就是如何?