5

Visual Studio 定义_byteswap_uint64_byteswap_ulongstdlib.h.

我是否正确地假设这不是标准的并且不会在 Linux 或 Darwin 上编译?

有没有办法以跨平台的方式定义这些包含?

4

2 回答 2

10

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
于 2017-09-10T05:41:03.637 回答
1

我不知道这样做的跨平台和有效方式。如果您使用 GCC,您可以使用内置的字节交换,如:uint32_t __builtin_bswap32 (uint32_t x)

这些速度很快,但肯定不能移植......除非你将各种版本包装在适当的 ifdefs 下

干杯弗朗西斯科

于 2017-05-25T09:29:32.220 回答