编译阶段打印宏内容

  对于大型C/C++工程,由于宏定义可能散落在各个头文件和Makefile当中。同时条件编译又是大型工程常用的技巧,所以宏定义的大量存在,给代码阅读增加了难度,如果搞不清楚宏定义的情况就无法掌握程序的执行流程。最简单的办法就是使用printf来打印这些宏,但是如果是带参数的宏就比较麻烦了。而且如果使用printf必须重新编译程序,并执行,当我们阅读的是内核源码或驱动程序,那重新执行的代价是相当可观的。如果在编译阶段可以打印宏的内容就可以省去这些麻烦。以下内容就阐述一种可行的方法。
  首先介绍#pragma message 。 它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

  #pragma message(“消息文本”)
  当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
  当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法:
  #ifdef _X86
  #pragma message(“_X86 macro activated!”)
  #endif
  当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。
  有时候不仅希望知道宏是否定义了,而且希望知道宏定义的内容,#可以将宏展开为字符串,下面的示例演示如何在编译阶段打印宏内容。
  //两个用于测试的宏
  #define PI 3.1415926
  #define MAX(a,b) (a)>(b) ? (a) :(b)
  //首先定义两个辅助宏
  #define   PRINT_MACRO_HELPER(x)   #x 
  #define   PRINT_MACRO(x)   #x"="PRINT_MACRO_HELPER(x) 
  //编译阶段打印宏内容
  #pragma message(PRINT_MACRO(PI))
  #pragma message(PRINT_MACRO(PI2))
  #pragma message(PRINT_MACRO(MAX(a,b)))
  #pragma message(PRINT_MACRO(MAX(x,y)))
  结果输出
  note: #pragma message: PI=3.1415926  
  //PRINT_MACRO中的两个x都被替换为PI,PRINT_MACRO_HELPER中的#x替换为宏PI的内容
  note: #pragma message: PI2=PI2          
  //PI2不存在的情况下PRINT_MACRO_HELPER将#x换做PI2
  note: #pragma message: MAX(a,b)=(a)>(b) ? (a) :(b)
  note: #pragma message: MAX(x,y)=(x)>(y) ? (x) :(y)


  以上转自:编译阶段打印宏内容


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值