Я считаю, что это то, о чем просили. Я тестировал это только на машине с прямым порядком байтов под msvc. Кто-нибудь, пожалуйста, подтвердите на машине с прямым порядком байтов.
#define LITTLE_ENDIAN 0x41424344UL
#define BIG_ENDIAN 0x44434241UL
#define PDP_ENDIAN 0x42414443UL
#define ENDIAN_ORDER ('ABCD')
#if ENDIAN_ORDER==LITTLE_ENDIAN
#error "machine is little endian"
#elif ENDIAN_ORDER==BIG_ENDIAN
#error "machine is big endian"
#elif ENDIAN_ORDER==PDP_ENDIAN
#error "jeez, machine is PDP!"
#else
#error "What kind of hardware is this?!"
#endif
В качестве побочного примечания (для конкретного компилятора) с агрессивным компилятором вы можете использовать оптимизацию с «устранением мертвого кода» для достижения того же эффекта, что и во время компиляции, #if
например:
unsigned yourOwnEndianSpecific_htonl(unsigned n)
{
static unsigned long signature= 0x01020304UL;
if (1 == (unsigned char&)signature) // big endian
return n;
if (2 == (unsigned char&)signature) // the PDP style
{
n = ((n << 8) & 0xFF00FF00UL) | ((n>>8) & 0x00FF00FFUL);
return n;
}
if (4 == (unsigned char&)signature) // little endian
{
n = (n << 16) | (n >> 16);
n = ((n << 8) & 0xFF00FF00UL) | ((n>>8) & 0x00FF00FFUL);
return n;
}
// only weird machines get here
return n; // ?
}
Выше , основано на том , что компилятор распознает значения постоянная во время компиляции, полностью удаляет код внутри if (false) { ... }
и заменяет код как if (true) { foo(); }
с foo();
наихудшим сценарием: компилятор не делает оптимизацию, вы все равно получите правильный код , но немного медленнее.