As stated earlier, the only “real” way to detect Big Endian is to use runtime tests.
However, sometimes, a macro might be preferred.
Unfortunately, I’ve not found a single “test” to detect this situation, rather a collection of them.
For example, GCC recommends : __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
. However, this only works with latest versions, and earlier versions (and other compilers) will give this test a false value “true”, since NULL == NULL. So you need the more complete version : defined(__BYTE_ORDER__)&&(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
OK, now this works for newest GCC, but what about other compilers ?
You may try __BIG_ENDIAN__
or __BIG_ENDIAN
or _BIG_ENDIAN
which are often defined on big endian compilers.
This will improve detection. But if you specifically target PowerPC platforms, you can add a few more tests to improve even more detection. Try _ARCH_PPC
or __PPC__
or __PPC
or PPC
or __powerpc__
or __powerpc
or even powerpc
. Bind all these defines together, and you have a pretty fair chance to detect big endian systems, and powerpc in particular, whatever the compiler and its version.
So, to summarize, there is no such thing as a “standard pre-defined macros” which guarantees to detect big-endian CPU on all platforms and compilers, but there are many such pre-defined macros which, collectively, give a high probability of correctly detecting big endian under most circumstances.