include - _byteswap_uint64 和 _byteswap_ulong 的跨平台定义

标签 include cross-platform endianness htonl

Visual Studio defines _byteswap_uint64 and _byteswap_ulong in stdlib.h .

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

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

最佳答案

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

关于include - _byteswap_uint64 和 _byteswap_ulong 的跨平台定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41770887/

相关文章:

c++ - IDE 的最兼容的 C++ Doxygen 注释

c# - 是否有适用于 C#/.NET 的跨平台 GUI 框架?

c++ - 使用 system() 跨平台。使用 cygwin 和 g++ 编译

sql-server - SQL Server 二进制(128)从小端转换为大端

c# - 160位哈希算术运算的最高有效字节是多少?

c++ - #includes 的顺序以避免链接错误

c - 为什么标准库在 .c 文件而不是头文件中有它们的#include <...>

php - 从另一个文件调用单个函数而不将整个文件包含在php中

c++ - 位交换和指针

c++ - #include 在 C++ 中如何工作?