проверка на бесконечность с надстройкой отличается от результата маленьким кодом - PullRequest
3 голосов
/ 03 декабря 2010

Привет всем Я делаю некоторые предварительные проверки, чтобы увидеть, является ли моя система с прямым порядком байтов или с прямым порядком байтов. В LInux по умолчанию он должен быть прямым порядком байтов, но я просто хотел перепроверить. Я использовал 2 подхода

  1. с использованием поддержки Boost Endian
  2. используя некоторый код, который я нашел в сети

Я использовал следующее статическое утверждение

BOOST_STATIC_ASSERT(!BIG_ENDIAN);

, который не срабатывает во время компиляции, так что я думаю ... ммхх ... мой системный порядок байтов? Это ошибка у меня

error: invalid application of ‘sizeof’ to incomplete type 
boost::STATIC_ASSERTION_FAILURE<false>’ 

Если я выполню тест с использованием некоторого кода, подобного приведенному ниже, он подтвердит, что система имеет младший порядок. Знаете ли вы, что я делаю неправильно, и правильно ли я использую макрос 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;

}

1 Ответ

4 голосов
/ 03 декабря 2010

BIG_ENDIAN не определяется с помощью Boost.Если вы посмотрите на файл

#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

вместо этого.Извините за путаницу.

...