我的库需要读入大端整数(4字节)并将它们转换为主机的字节序以进行处理。虽然on * nix ntohl
在Windows下使用ntohl
,但需要使用Ws2_32.dll
(Winsock)。
这种依赖是我宁愿消除的依赖。最简单的方法似乎是编写我自己的endian-swapping函数(一个简单的练习,考虑到性能不是一个真正的问题)。但是,这需要一种方法来确定我的库正在编译的系统的字节顺序(所以我可以#ifdef
在大端系统上交换交换功能。)
由于似乎没有标准的预处理器定义用于字节序,所以似乎有必要使用我的构建系统(cmake)来确定它。这样做的最佳方法是什么? (我厌倦了'编译测试文件并看到'类型解决方案,因为它们似乎会禁止交叉编译。)
答案 0 :(得分:11)
此CMake功能也可以这样做,http://www.cmake.org/cmake/help/v3.5/module/TestBigEndian.html
include (TestBigEndian)
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
if(IS_BIG_ENDIAN)
message(STATUS "BIG_ENDIAN")
else()
message(STATUS "LITTLE_ENDIAN")
endif()
我认为仅支持CMake 3.0
答案 1 :(得分:7)
编辑:我看到cmake
有一个TestBigEndian.cmake
脚本,但这会进行编译和测试运行以查看系统是否为Big Endian,这不是您想要做的。
您可以使用这样的函数在自己的程序中检查系统的字节顺序。
bool isLittleEndian()
{
short int number = 0x1;
char *numPtr = (char*)&number;
return (numPtr[0] == 1);
}
基本上创建一个整数,并读取其第一个字节(最低有效字节)。如果该字节为1,则系统为小端,否则为大端。
但是,这不允许您在运行时之前确定字节顺序。
如果你想要编译时确定系统字节顺序,除了'构建一个测试程序然后编译我的真实程序'la cmake
,或者对定义的特定宏进行穷举检查之外,我没有看到太多选择通过编译器,例如GCC 4.x上的__BIG_ENDIAN__
。
更新您可能也想看看Boost自己的endian.hpp
作为示例。
http://www.boost.org/doc/libs/1_43_0/boost/detail/endian.hpp