【问题标题】:Cross-platform definition of _byteswap_uint64 and _byteswap_ulong_byteswap_uint64和_byteswap_ulong的跨平台定义
【发布时间】:2017-01-20 19:19:37
【问题描述】:

Visual Studio defines _byteswap_uint64 and _byteswap_ulong in stdlib.h.

我是否认为这不是标准的并且无法在 Linux 或 Darwin 上编译?

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

【问题讨论】:

    标签: include cross-platform endianness htonl


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      我不知道有一种跨平台的高效方法。如果您使用 GCC,您可以使用内置的字节交换,例如: uint32_t __builtin_bswap32 (uint32_t x)

      那些速度很快,但肯定不便携......除非你将各种版本包装在适当的 ifdefs 下

      干杯 弗朗切斯科

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 1970-01-01
        • 2012-04-16
        • 2011-01-17
        • 2013-02-22
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多