IS_BIG_ENDIAN宏可正常运行但在#if预处理指令中出现编译错误
错误原因与修复方案
根因分析
#if是C语言预处理阶段的指令,仅支持计算编译期可确定的整型常量表达式,你定义的IS_BIG_ENDIAN宏使用了复合字面量、取地址、内存读取逻辑,这些属于运行时才能执行的操作,预处理阶段无法完成求值,TinyCC预处理器解析到非法表达式时就会抛出错误 ')' expected (got "0")。- 你注释掉
#if到#endif的条件编译块后,预处理器不需要对IS_BIG_ENDIAN做编译期求值,只有main函数里的运行时代码用到该宏,因此可以正常编译运行。 - 额外问题:代码未包含
<stdint.h>头文件,uint16_t类型无定义,本身也会触发编译错误。
修复方案
改用编译器预定义的、可在预处理阶段识别的大小端常量判断即可,主流编译器(含TinyCC、GCC、Clang)均内置了__BYTE_ORDER__系列预处理宏,修改后的代码如下:
#include <stdio.h> #include <stdint.h> // 运行时用的大小端判断宏保留,供main函数使用 #define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1}) // 预处理阶段用编译器内置宏判断大小端 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ struct ieee { unsigned long sign:1; unsigned long expo:8; unsigned long mantissa:23; }; #else struct ieee { unsigned long mantissa:23; unsigned long expo:8; unsigned long sign:1; }; #endif int main() { printf("%d\n", IS_BIG_ENDIAN); }
内容的提问来源于stack exchange,提问作者Antoni Gual Via
相关产品推荐
相关产品推荐

