C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 有没有更好的方法将格式化输出传递给OutputDebugString?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_1@
通常,当我需要在 Windows进行调试输出时,我使用以下C代码段:

#ifdef _DEBUG
#define DBGPRINT( kwszDebugFormatString,... ) \
{ \
    wprintf_s( L"[%s:%d] ",__FUNCTIONW__,__LINE__ ); \
    wprintf_s( kwszDebugFormatString,__VA_ARGS__ ); \
}
#else
#define DBGPRINT( kwszDebugFormatString,...) ;;
#endif@H_419_12@ 
 

我想重新编码它以使用不接受格式字符串的OutputDebugString.我认为静态地在堆栈上分配一个小数组(例如,WCHAR wszBuf [100] = {0};)有点粗糙,因为它可能消耗比分配的内存更多或更少的内存并截断输出或浪费内存.我编写了以下代码解决所有这些问题,但我担心因为宏有点大.

#ifdef _DEBUG
#define DBGPRINT( kwszDebugFormatString,... ) \
{ \
    INT iLinenumber = __LINE__; \
    FILE *fileNul = NULL; \
    INT cbFormatString = 0; \
    PWCHAR wszDebugString = NULL; \
    size_t st_Offset = 0; \
    \
    /* Determine the number of characters in the format String by wriTing to NUl. */\
    fopen_s( &fileNul,"nul","w" ); \
    cbFormatString = fwprintf_s( fileNul,L"[%s:%d]",iLinenumber ) * sizeof( WCHAR ); \
    cbFormatString += fwprintf_s( fileNul,kwszDebugFormatString,__VA_ARGS__ ) * sizeof( WCHAR ) + 2; \
    \
    /* Depending on the size of the format String,allocate space on the stack or the heap. */ \
    wszDebugString = (PWCHAR)_malloca( cbFormatString ); \
    \
    /* Populate the buffer with the contents of the format String. */ \
    StringCbPrintfW( wszDebugString,cbFormatString,iLinenumber ); \
    StringCbLengthW( wszDebugString,&st_Offset ); \
    StringCbPrintfW( &wszDebugString[st_Offset / sizeof(WCHAR)],cbFormatString - st_Offset,__VA_ARGS__ ); \
    \
    OutputDebugStringW( wszDebugString ); \
    \
    _freea( wszDebugString ); \
    fclose( fileNul ); \
}
#else
#define DBGPRINT( kwszDebugFormatString,... ) ;;
#endif@H_419_12@ 
 

几点说明:

>我使用_malloca()和_freea(),以便输出足够小时可以使用堆栈分配.
>我不知道如何获得完全展开的格式字符串的正确大小.我能想到的最好的解决方案是将其转储到NUL并从那里计算出正确的尺寸.
>我使用了一个宏,因为我不相信在使用函数时有一种简单的方法可以实现相同的结果.

我的问题很简单,因为某种原因(特别是尺寸或效率低下),这个宏会被视为不良做法吗?如果是这样,我应该虑哪些替代方案?

如果其他人想知道,我使用了评论和所选答案中的建议,并提出了以下代码.非常感谢所有评论或回答的人 – 如果你有一个聪明的方法想要分享,请随意添加更多!

#ifdef _DEBUG
#define DBGPRINT(kwszDebugFormatString,...) _DBGPRINT(__FUNCTIONW__,__LINE__,__VA_ARGS__)

VOID _DBGPRINT( LPCWSTR kwszFunction,INT iLinenumber,LPCWSTR kwszDebugFormatString,... ) \
{
    INT cbFormatString = 0;
    va_list args;
    PWCHAR wszDebugString = NULL;
    size_t st_Offset = 0;

    va_start( args,kwszDebugFormatString );

    cbFormatString = _scwprintf( L"[%s:%d] ",kwszFunction,iLinenumber ) * sizeof( WCHAR );
    cbFormatString += _vscwprintf( kwszDebugFormatString,args ) * sizeof( WCHAR ) + 2;

    /* Depending on the size of the format String,allocate space on the stack or the heap. */
    wszDebugString = (PWCHAR)_malloca( cbFormatString );

    /* Populate the buffer with the contents of the format String. */
    StringCbPrintfW( wszDebugString,L"[%s:%d] ",iLinenumber );
    StringCbLengthW( wszDebugString,&st_Offset );
    StringCbVPrintfW( &wszDebugString[st_Offset / sizeof(WCHAR)],args );

    OutputDebugStringW( wszDebugString );

    _freea( wszDebugString );
    va_end( args );
}
#else
#define DBGPRINT( kwszDebugFormatString,... ) ;;
#endif@H_419_12@

解决方法

如果你将所有代码放入普通的varargs函数然后在你的宏中调用它会更简单,更不@R_437_10197@,类似于:

void dbgprint(const wchar_t *func,int line,const wchar_t *fmt,...) {
   // Fomat the String,maybe with vsprintf,log it,etc.
}

#define DBGPRINT(fmt,...) dbgprint(__WFUNCTION__,fmt,__VA_ARGS__)@H_419_12@

大佬总结

以上是大佬教程为你收集整理的c – 有没有更好的方法将格式化输出传递给OutputDebugString?全部内容,希望文章能够帮你解决c – 有没有更好的方法将格式化输出传递给OutputDebugString?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。