c语言wprintf函数底层代码,C 输出代码所在的文件、行数以及函数名称

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

[cpp]#include

#include

//替换函数名

#ifndef _DEBUG

#define LOGFUNC(...) ((void)0)

#else

#define LOGFUNC(...) (printf(__VA_ARGS__))

#endif

//宏前面加上##的作用在于:当可变参数的个数为0时,这里的## 起到把前面多余的','去掉的作用

#define DEBUG_INFO(format, ...) printf('File:%s, Line:%d, Function:%s, %s', \

__FILE__, __LINE__ , __FUNCTION__, ##__VA_ARGS__);

void show_debug_info()

{

DEBUG_INFO('%s', 'hello world');

}

int main()

{

LOGFUNC('%s\n', 'this is test');

show_debug_info();

system('pause');

return 0;

}

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

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

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

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

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

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

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

[cpp]#ifdef _DEBUG

#define OUTPUT_DEBUGW(fmt, ...) PrintDebugStringW(_T(__FILE__),__LINE__, fmt, __VA_ARGS__)

#else

#define OUTPUT_DEBUGW ((void)0)

#endif

void PrintDebugStringW(const wchar_t *file, int lineno, const wchar_t *pszFmt, ...)

{

va_list vlArgs = NULL;

va_start(vlArgs, pszFmt);

size_t nLen = _vscwprintf(pszFmt, vlArgs) + 1;

wchar_t *strBuffer =

new wchar_t[nLen];

_vsnwprintf_s(strBuffer, nLen, nLen, pszFmt, vlArgs);

va_end(vlArgs);

//OutputDebugStringW(strBuffer);

wchar_t buf[4096];

swprintf_s(buf, 4096, L'%s: tid[%d] :\t%s\n', file, lineno, GetCurrentThreadId(), strBuffer);

OutputDebugStringW(buf);

delete [] strBuffer;

}

154954435_1_20190224113514287

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值