在输出调试信息的时候,经常会用到这几个宏。首先看一段示例代码,再来介绍这几个宏:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. //替换函数名
  4. #ifndef _DEBUG
  5. #define LOGFUNC(...) ((void)0)
  6. #else
  7. #define LOGFUNC(...) (printf(__VA_ARGS__))
  8. #endif
  9. //宏前面加上##的作用在于:当可变参数的个数为0时,这里的## 起到把前面多余的","去掉的作用
  10. #define DEBUG_INFO(format, ...) printf("File:%s, Line:%d, Function:%s, %s", \
  11. __FILE__, __LINE__ , __FUNCTION__, ##__VA_ARGS__);
  12. void show_debug_info()
  13. {
  14. DEBUG_INFO("%s", "hello world");
  15. }
  16. int main()
  17. {
  18. LOGFUNC("%s\n", "this is test");
  19. show_debug_info();
  20. system("pause");
  21. return 0;
  22. }

1) __VA_ARGS__ 是一个可变参数的宏,总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。

2) __FILE__ 宏在预编译时会替换成当前的源文件名

3) __LINE__ 宏在预编译时会替换成当前的行号

4) __FUNCTION__ 宏在预编译时会替换成当前的函数名称

5)类似的宏还有__DATE__, __TIME__,__STDC__, __TIMESTAMP__等,可以当作一个变量来使用。

关于宏##的有关解析,在另一篇文章有介绍:http://www.cnblogs.com/fnlingnzb-learner/p/6823575.html

上述代码中定义的DEBUG_INFO宏,就是输出控制台的调试信息。比如说,我们通过 OutputDebugString 输出调试信息这样写:

  1. #ifdef _DEBUG
  2. #define OUTPUT_DEBUGW(fmt, ...) PrintDebugStringW(_T(__FILE__),__LINE__, fmt, __VA_ARGS__)
  3. #else
  4. #define OUTPUT_DEBUGW ((void)0)
  5. #endif
  6. void PrintDebugStringW(const wchar_t *file, int lineno, const wchar_t *pszFmt, ...)
  7. {
  8. va_list vlArgs = NULL;
  9. va_start(vlArgs, pszFmt);
  10. size_t nLen = _vscwprintf(pszFmt, vlArgs) + 1;
  11. wchar_t *strBuffer = new wchar_t[nLen];
  12. _vsnwprintf_s(strBuffer, nLen, nLen, pszFmt, vlArgs);
  13. va_end(vlArgs);
  14. //OutputDebugStringW(strBuffer);
  15. wchar_t buf[4096];
  16. swprintf_s(buf, 4096, L"%s<%d>: tid[%d] :\t%s\n", file, lineno, GetCurrentThreadId(), strBuffer);
  17. OutputDebugStringW(buf);
  18. delete [] strBuffer;
  19. }

C++ 输出代码所在的文件、行数以及函数名称的更多相关文章

  1. VS 自动展开选中当前代码所在的文件位置的功能

    这个功能相当好,自动在Solution Explorer中展开并定位到当前代码所在的文件,免得自己找位置要找很久. 设置方法: tool>>options>>projects ...

  2. 严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译。

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译. 默认情况下,对象文件最多可存放 65,536 (2^16) 个可寻址的 ...

  3. MFC vc++严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3646 “m_SockClient”: 未知重写说明符

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 C3646 “m_SockClient”: 未知重写说明符 MFC_TCP_CSocket_Client c:\users\tt2018\docu ...

  4. devexpress 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 “lc.exe”已退出,代码为 -1。

    将licensens.licx删除,就能正常运行

  5. C#在控制台输出异常所在的行数

    对于异常,我们经常用try-catch语句来处理,一种常见的方式是在catch语句块用MessageBox.Show("异常")这种弹窗的方式来报告异常.但是有些时候,有些异常发生 ...

  6. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

  7. Python逐块读取大文件行数的代码 - 为程序员服务

    Python逐块读取大文件行数的代码 - 为程序员服务 python数文件行数最简单的方法是使用enumerate方法,但是如果文件很大的话,这个方法就有点慢了,我们可以逐块的读取文件的内容,然后按块 ...

  8. Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.

    Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi:::  代码行数(凝视行数,空白的行数), 方法数,class数 1 2. ...

  9. Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.

    Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi:::  代码行数(注释行数,空白的行数), 方法数,class数 1 2. 过滤器 ...

随机推荐

  1. ActiveMQ基于JMS的pub/sub传播机制

    原文地址:[ActiveMQ实战]基于JMS的pub/sub传播机制 发布订阅模型 就像订阅报纸,我们可以选择一份或者多份报纸.比如:北京日报.人民日报.这些报纸就相当于发布订阅模型中的topic.如 ...

  2. ExecutorService 用例

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Tes ...

  3. hdu 1081(最大子矩阵)

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. opencv python基本操作

    Python usage crop frame: croppedframe = frame[ymin:ymax, xmin:xmax] resize frame: reszframe = cv2.re ...

  5. “无法在web服务器上启动调试,不是Debugger User组成员..."

    在使用VS.net2003开发asp.net项目时,有时候在你调试项目时,会提示”无法在web服务器上启动调试,不是Debugger User组成员..."这样一个错误信息.很是让人头疼,一 ...

  6. Javascript备忘录-枚举一个对象的所有属

    for...in 循环 var obj = { age: 18, fname: "Rand ", lname: "McKinnon" }; function s ...

  7. JavaScript如何判断变量是数组还是对象

    编辑 方法一:通过判断变量的类型,并且变量的length属性(除了有一种例外是arguments对象–当给函数传参时数据存储的地方) var arr=[2,3,4]; var obj={"n ...

  8. 基于node的前端页面实时更新。呦吼~

    学习了gulp,webpack后越发觉得前端开发万分的有趣,首当其冲的就是解决了狂按f5的尴尬. 当我们按下ctrl+s保存后页面自动更新了,我就觉得我f5键在隐隐的发笑. 1.node_npm_li ...

  9. catalina.out日志切割

    安装cronlog rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum ins ...

  10. Ubuntu Nginx

    如果是阿云的ECS服务器,默认是已经安装了Apache服务器的,但一般都用不到,可以选择将它卸载 sudo service apache2 stop update-rc.d -f apache2 re ...