与学校代码的结果相比,使用提升的字节顺序检查有所不同

时间:2010-12-03 12:05:48

标签: c++ boost endianness

大家好 我正在做一些初步检查,看我的系统是big-endian还是little-endian。 在LInux中,默认情况下它应该是little-endian,但我只想仔细检查。 我使用了两种方法

  1. 使用boost endian支持
  2. 使用我在网络上找到的一些代码
  3. 我使用了以下静态断言

    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;
    
    }
    

2 个答案:

答案 0 :(得分:4)

Boost未定义

BIG_ENDIAN。如果你看文件

#include <boost/detail/endian.hpp>

您会看到在那里定义的宏有BOOST_BIG_ENDIANBOOST_LITTLE_ENDIANBOOST_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);
}