_byteswap_uint64 和 _byteswap_ulong 的跨平台定义
Cross-platform definition of _byteswap_uint64 and _byteswap_ulong
Visual Studio defines _byteswap_uint64
and _byteswap_ulong
in stdlib.h
.
我的假设是否正确,这不是标准的并且不会在 Linux 或 Darwin 上编译?
有没有办法以跨平台的方式定义这些包含?
我不知道有一种跨平台的高效方法可以做到这一点。如果你使用 GCC,你可以使用内置的 byteswap,比如:
uint32_t __builtin_bswap32 (uint32_t x)
这些速度很快但肯定不可移植...除非您将各种版本包装在适当的 ifdefs 下
干杯
弗朗切斯科
Google的CityHash源代码使用了这段代码:
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
Visual Studio defines _byteswap_uint64
and _byteswap_ulong
in stdlib.h
.
我的假设是否正确,这不是标准的并且不会在 Linux 或 Darwin 上编译?
有没有办法以跨平台的方式定义这些包含?
我不知道有一种跨平台的高效方法可以做到这一点。如果你使用 GCC,你可以使用内置的 byteswap,比如: uint32_t __builtin_bswap32 (uint32_t x)
这些速度很快但肯定不可移植...除非您将各种版本包装在适当的 ifdefs 下
干杯 弗朗切斯科
Google的CityHash源代码使用了这段代码:
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