大家好 我正在做一些初步检查,看我的系统是big-endian还是little-endian。 在LInux中,默认情况下它应该是little-endian,但我只想仔细检查。 我使用了两种方法
我使用了以下静态断言
BOOST_STATIC_ASSERT(!BIG_ENDIAN);
在编译期间失败,所以我虽然......嗯...是我的系统大端? 这是我的错误
error: invalid application of ‘sizeof’ to incomplete type
boost::STATIC_ASSERTION_FAILURE<false>’
如果我使用下面的代码进行测试,则确认系统是little-endian。 你知道我做错了吗?我正在使用Boost宏吗?
bool is_big_endian_v3(){ long x = 0x34333231; char *y = (char *) &x; if(std::strncmp(y,"1234",4)){ printf("Big Endian"); return true; }else{ printf("Little Endian"); return false; } std::runtime_error ex("I cannot be here"); throw ex; }
答案 0 :(得分:4)
BIG_ENDIAN
。如果你看文件
#include <boost/detail/endian.hpp>
您会看到在那里定义的宏有BOOST_BIG_ENDIAN
,BOOST_LITTLE_ENDIAN
或BOOST_PDP_ENDIAN
。这意味着您需要修改支票:
BOOST_STATIC_ASSERT(!defined(BOOST_BIG_ENDIAN));
或者,更好:
BOOST_STATIC_ASSERT(defined(BOOST_LITTLE_ENDIAN));
编辑:
以上并没有像我预期的那样进行宏扩展,所以我建议使用
#if !defined(BOOST_BIG_ENDIAN)
BOOST_STATIC_ASSERT(false);
#endif
代替。对不起,感到困惑。
答案 1 :(得分:0)
Boost库已更改,现在(2019年7月)上一个答案中的代码会生成弃用消息并提出以下建议:
#include <boost/predef/other/endian.h>
#include <stdlib.h>
#include <iostream>
int main()
{
#if BOOST_ENDIAN_BIG_BYTE
std::cout << "Big endian." << std::endl;
#elif BOOST_ENDIAN_LITTLE_BYTE
std::cout << "Little endian." << std::endl;
#else
std::cout << "Unknown endian." << std::endl;
#endif
exit(EXIT_SUCCESS);
}