我的库需要读入大端整数(4字节)并将它们转换为主机的字节序以进行处理.虽然on*nix ntohl在Windows下使用过,但ntohl需要使用Ws2_32.dll(Winsock).
这种依赖是我宁愿消除的依赖.最简单的方法似乎是编写我自己的endian-swapping函数(一个简单的练习,考虑到性能不是一个真正的问题).但是,这需要一种方法来确定我的库正在编译的系统的字节序(因此我可以#ifdef在大端系统上输出交换功能).
由于似乎没有标准的预处理器定义用于endianess,似乎有必要使用我的构建系统(cmake)来确定它.这样做的最佳方法是什么?(我厌倦了'编译一个测试文件并看到'类型解决方案,因为它们似乎会禁止交叉编译.)
The*_*ube 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()
Run Code Online (Sandbox Code Playgroud)
我认为只有CMake 3.0支持
编辑:我看到它cmake有一个TestBigEndian.cmake脚本,但它会进行编译和测试运行,看看系统是否是Big Endian,这不是你想要做的.
您可以使用这样的函数在自己的程序中检查系统的字节序.
bool isLittleEndian()
{
short int number = 0x1;
char *numPtr = (char*)&number;
return (numPtr[0] == 1);
}
Run Code Online (Sandbox Code Playgroud)
基本上创建一个整数,并读取其第一个字节(最低有效字节).如果该字节为1,则系统为小端,否则为大端.
但是,这不允许您在运行时之前确定字节序.
如果你想要编译时间确定系统字节顺序,除了"构建一个测试程序然后编译我的真实程序" cmake,或者对编译器定义的特定宏(例如__BIG_ENDIAN__GCC 4)进行详尽的检查之外,我没有看到太多选择. X.
更新你可能也想看看Boost自己endian.hpp的例子.
http://www.boost.org/doc/libs/1_43_0/boost/detail/endian.hpp
| 归档时间: |
|
| 查看次数: |
4811 次 |
| 最近记录: |