这个 C99 IS_LITTLE_ENDIAN 宏可移植吗?
Is this C99 IS_LITTLE_ENDIAN macro portable?
在寻找编译时字节序检测宏时,我发现了这个:
#define IS_LITTLE_ENDIAN (1 == *(unsigned char *)&(const int){1})
根据 an answer to C Macro definition to determine big endian or little endian machine?,这可以在编译时评估(至少使用 GCC)并且不假定任何内存对齐。这真的可以移植吗(前提是 C99 可用),如果可以的话,这个宏的注意事项是什么?
这里确实没有未定义的行为,因此在这个意义上它是可移植的。
但条件不一定证明IS_LITTLE_ENDIAN
性。
int
的存储安排主要留给实现。除了经典的小端和大端方案之外,还有其他选择,您的宏可能会产生误报。
在寻找编译时字节序检测宏时,我发现了这个:
#define IS_LITTLE_ENDIAN (1 == *(unsigned char *)&(const int){1})
根据 an answer to C Macro definition to determine big endian or little endian machine?,这可以在编译时评估(至少使用 GCC)并且不假定任何内存对齐。这真的可以移植吗(前提是 C99 可用),如果可以的话,这个宏的注意事项是什么?
这里确实没有未定义的行为,因此在这个意义上它是可移植的。
但条件不一定证明IS_LITTLE_ENDIAN
性。
int
的存储安排主要留给实现。除了经典的小端和大端方案之外,还有其他选择,您的宏可能会产生误报。