编译阶段打印宏内容
2012-09-15 11:03
225 查看
编译阶段打印宏内容
对于大型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)
对于大型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)
相关文章推荐
- 编译阶段打印宏内容
- 编译阶段打印宏内容
- 在编译阶段打印提示信息
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 编译时打印宏内容
- JS 打印网页局部内容
- C# 对于xml文件,对生成操作( 内容 编译 嵌入的资源)各个选项的差别,读写的差别
- 打印部分页面内容(Javascript)
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
- 在Silverlight中将多页内容压缩实现单页打印
- 打印easyui的datagrid内容
- 用window.print()打印指定div里面的内容(转载的)
- 编译有哪些阶段,动态链接和静态链接的区别 c++
- 打印出 本次编译时的变量及其值
- 整行读取键盘录入的内容,并打印出来
- 示例:Servlet读取文件内容并在页面打印输出
- JavaScript是解释型语言,是不需要编译的,浏览器直接解释源代码,并执行在内存中创建变量等操作。不需要编译,即不存在什么语法不语法的,因为没有编译阶段,直接在运行的阶段才发现有没有语法错误
- gdb打印完整字符串内容
- js 打印 iframe div 内容