分享

C 输出代码所在的文件、行数以及函数名称

 豫龙晏子ylyz 2019-02-24

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

[cpp]

  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__等,可以当作一个变量来使用。

关于宏##的有关解析,在另一篇文章有介绍: l

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

[cpp]

  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++ 输出代码所在的文件、行数以及函数名称

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多