Я верю, что об этом просили.
Я проверял это только на машине с прямым порядком байтов под 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();
Наихудший сценарий: компилятор не выполняет оптимизация, вы все еще получаете правильный код, но немного медленнее.