Cross-platform definition of _byteswap_uint64 and _byteswap_ulong

﹥>﹥吖頭↗ 提交于 2019-12-12 15:08:41

问题


Visual Studio defines _byteswap_uint64 and _byteswap_ulong in stdlib.h.

Am I right to assume, that this is not standard and won't compile on Linux or Darwin?

Is there a way to define these includes in a cross-platform way?


回答1:


Google's CityHash source code uses this code:

https://github.com/google/cityhash/blob/8af9b8c2b889d80c22d6bc26ba0df1afb79a30db/src/city.cc#L50

#ifdef _MSC_VER

#include <stdlib.h>
#define bswap_32(x) _byteswap_ulong(x)
#define bswap_64(x) _byteswap_uint64(x)

#elif defined(__APPLE__)

// Mac OS X / Darwin features
#include <libkern/OSByteOrder.h>
#define bswap_32(x) OSSwapInt32(x)
#define bswap_64(x) OSSwapInt64(x)

#elif defined(__sun) || defined(sun)

#include <sys/byteorder.h>
#define bswap_32(x) BSWAP_32(x)
#define bswap_64(x) BSWAP_64(x)

#elif defined(__FreeBSD__)

#include <sys/endian.h>
#define bswap_32(x) bswap32(x)
#define bswap_64(x) bswap64(x)

#elif defined(__OpenBSD__)

#include <sys/types.h>
#define bswap_32(x) swap32(x)
#define bswap_64(x) swap64(x)

#elif defined(__NetBSD__)

#include <sys/types.h>
#include <machine/bswap.h>
#if defined(__BSWAP_RENAME) && !defined(__bswap_32)
#define bswap_32(x) bswap32(x)
#define bswap_64(x) bswap64(x)
#endif

#else

#include <byteswap.h>

#endif



回答2:


I'm not aware of a cross-platform and efficient way of doing that. If you use GCC you can use the builtin byteswap like: uint32_t __builtin_bswap32 (uint32_t x)

Those are fast but certainly not portable... unless you wrap the various versions under the appropriate ifdefs

Cheers Francesco



来源:https://stackoverflow.com/questions/41770887/cross-platform-definition-of-byteswap-uint64-and-byteswap-ulong

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!