私はこれが求められていたと信じています。私はこれを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();
、コンパイラは最適化を行いません、あなたはまだ正しいコードを取得しますが少し遅く:最悪のシナリオ。