我相信这就是所要的。我仅在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();
最坏的情况:编译器不会做了优化,你仍然可以得到正确的代码,但有点慢。