我的库需要读入 big-endian 整数(4 字节)并将它们转换为主机的 endian 顺序进行处理。在 *nix 上时 ntohl
在 Windows 下使用了 ntohl
需要使用 Ws2_32.dll
(温索克)。
这种依赖是我宁愿消除的依赖。最简单的方法似乎是编写我自己的字节序交换函数(一个微不足道的练习,考虑到性能并不是真正的问题)。但是,这需要一种方法来确定正在编译我的库的系统的字节序(因此我可以 #ifdef
在大字节序系统上输出交换函数)。
由于似乎没有用于字节序的标准预处理器定义,因此似乎有必要使用我的构建系统 (cmake) 来确定它。这样做的最佳方法是什么? (我厌倦了“编译测试文件并查看”类型的解决方案,因为它们似乎会抑制交叉编译。)
最佳答案
编辑:我看到了 cmake
有一个 TestBigEndian.cmake
脚本,但这会进行编译和测试运行以查看系统是否为 Big Endian,这不是您想要做的。
您可以使用这样的函数在自己的程序中检查系统的字节序。
bool isLittleEndian()
{
short int number = 0x1;
char *numPtr = (char*)&number;
return (numPtr[0] == 1);
}
基本上创建一个整数,并读取它的第一个字节(最低有效字节)。如果该字节为 1,则系统为小端,否则为大端。
但是,这不允许您在运行时之前确定字节顺序。
如果您想确定系统字节序的编译时间,除了“构建一个测试程序然后编译我的真实程序”之外,我看不到太多替代方案,如
cmake
,或对编译器定义的特定宏进行详尽检查,例如__BIG_ENDIAN__
在 GCC 4.x 上。更新 您可能想看看 Boost 自己的
endian.hpp
也举个例子。http://www.boost.org/doc/libs/1_43_0/boost/detail/endian.hpp
关于cmake - 使用 CMake 检测字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877344/