Sorry, I should not have used #elif, in fact ALL macros are defined! BOOST_ENDIAN_BIG_BYTE BOOST_ENDIAN_BIG_WORD BOOST_ENDIAN_LITTLE_BYTE BOOST_ENDIAN_LITTLE_WORD What does this mean? I see that g++ has #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ Frédéric 2017-04-05 14:23 GMT+02:00 Frédéric Bron <frederic.bron@m4x.org>:
I think the modern way to do this is to use Boost.Predef[1].
I used predef in a small program (see below) but I'm surprised by the output: BOOST_ENDIAN_BIG_BYTE value= 0102 memory=0201
predef says I am big endian but I see that most significant byte (0x01) is stored at the end which seems to indicate little endian. My processor is: Intel(R) Core(TM) i7-6700HQ
Frédéric
Program: #include <cstdint> #include <iomanip> #include <iostream>
#include <boost/predef.h>
int main() { #if defined(BOOST_ENDIAN_BIG_BYTE) std::cerr << "BOOST_ENDIAN_BIG_BYTE\n"; #elif defined(BOOST_ENDIAN_BIG_WORD) std::cerr << "BOOST_ENDIAN_BIG_WORD\n"; #elif defined(BOOST_ENDIAN_LITTLE_BYTE) std::cerr << "BOOST_ENDIAN_LITTLE_BYTE\n"; #elif defined(BOOST_ENDIAN_LITTLE_WORD) std::cerr << "BOOST_ENDIAN_LITTLE_WORD\n"; #endif
std::cout << std::hex << std::setfill('0');
std::uint16_t value = 0x0102; std::cout<<"value= "<<std::setw(4)<<value<<'\n';
auto c = reinterpret_cast<const std::uint8_t *>(&value); std::cout<<"memory="; for (int i = 0; i < (int)sizeof(value); ++i) { std::cout << std::setw(2) << static_cast<int>(c[i]); } std::cout << '\n';
return 0; }