如何在C语言编译期打印ADDR_RESERVED这类复杂宏的值?
编译期打印C语言宏值的方法
首先纠正你宏定义里的笔误:ADDR_START2 应该引用 ADDR_START1,ADDR_START3 应该引用 ADDR_START2,修正后的宏如下:
#define ADDR_START1 0x0001 #define SIZE1 0x1000 #define ADDR_START2 ADDR_START1 + SIZE1 #define SIZE2 0x2000 #define ADDR_START3 ADDR_START2 + SIZE2 #define SIZE3 0x3000 #define ADDR_RESERVED 0xFFFF - (ADDR_START3 + SIZE3)
这些宏都是常量表达式,预处理器完全能在编译期完成计算,不存在无法获取值的问题。以下是几种编译期查看ADDR_RESERVED值的方法:
方法1:利用编译警告输出
借助预处理器的字符串化特性,把宏值嵌入编译警告信息,编译时会直接显示值。示例代码:
#define STRINGIFY(x) #x #define TO_STRING(x) STRINGIFY(x) #warning ADDR_RESERVED = TO_STRING((ADDR_RESERVED))
使用GCC或Clang编译时,会直接输出计算后的最终十六进制数值,类似:
warning: ADDR_RESERVED = 0x3fff [-Wcpp]
方法2:利用编译错误强制输出
如果只是临时查看值,可以用#error替代#warning,编译时会触发错误并显示宏值,适合快速验证:
#define STRINGIFY(x) #x #define TO_STRING(x) STRINGIFY(x) #error ADDR_RESERVED = TO_STRING((ADDR_RESERVED))
编译时会直接输出结果,比如:
error: ADDR_RESERVED = 0x3fff [-Werror=cpp]
方法3:查看预处理器输出
直接让预处理器展开所有宏并输出结果,通过命令行执行:
gcc -E your_source_file.c | grep ADDR_RESERVED
输出结果里会显示ADDR_RESERVED展开后的最终计算值,无需编译完整程序。
内容的提问来源于stack exchange,提问作者Perlman Soong
相关产品推荐
相关产品推荐

