C++输出调试信息到VS中的输出窗口

在用Microsoft Visual Studio写Win64的C++程序时是没有命令行的,所以printf是不能用的。

方法一

调试的时候可以调用函数OutputDebugString来向vs的“输出”窗口里输出调试内容。像Java中的System.out.println一样往IDE的调试窗口里输出信息。

OutputDebugString只接受字符串指针,如果要输出其他格式,如int型,可以用sprintf把字符转成字符串,在传给OutputDebugString。

例子:

char chInput[512];  
sprintf(chInput, "int:%d\n", 500);  
OutputDebugString(chInput);  

方法二

在微软的Microsoft Visual Studio开发环境(如VS2010)下开发C++的Console Application的项目,标准输出信息(如std::cout、printf等)都是输出到控制台的(也就是传说中的黑窗)。有很多人是不喜欢这个黑窗口的,特别是习惯了像Eclipse(或者MyEclipse)这样的IDE的同志,如从Java转到C++的程序员,总想把输出信息集成到VS中。其实是有一种方式可以实现这种需求的,也就是把输出信息打印到在VS的output中,下面以VS2013为例进行说明。

选择你的项目,右键property(属性)->Configuration Properties(配置属性)->Build Events(生成事件)->Post-Build Event(预先生成事件),在右方窗口的Command Line(命令行)栏中输入你编译好的exe文件所在路径。

如我的HSIMRI工程在:

D:\resources\9_VS2013\Projects\20170627\1_HSIMRI\2\HSIMRI\x64\Debug

路径下,则在Command Line栏中输入

D:\resources\9_VS2013\Projects\20170627\1_HSIMRI\2\HSIMRI\x64\Debug\HSIMRI.exe。当然你的Build的输出路径有可能会改变,为避免Build输出路径改变后重新更改Command Line的值,可以输入$(OutDir)$(ProjectName).exe,

和D:\resources\9_VS2013\Projects\20170627\1_HSIMRI\2\HSIMRI\x64\Debug\HSIMRI.exe

的作用相同。

这样build结束后自动执行该exe程序,将程序输出信息打印到VS的output窗口中,不需要再按F5执行run。

如我的程序中包含cout的代码中有一部分代码如下所示:

// 获取读取的图像中存储的信息。
reader->GetDataOrigin(origin);
// 获取读取的三维图像的像素间隔,将三个方向的像素间隔分别存储到数组space[3]中。
reader->GetDataSpacing(space);
reader->GetOutput()->GetDimensions(imageDimensions);
cout << imageDimensions[0] << imageDimensions[1] << imageDimensions[2] << endl;
reader->GetOutput()->GetExtent(extent);
cout << "Xmin=" << extent[0] << "  Xmax=" << extent[1] << endl;
cout << "Ymin=" << extent[2] << "  Ymax=" << extent[3] << endl;
cout << "Zmin=" << extent[4] << "  Zmax=" << extent[5] << endl;

output窗口的输出信息:

085725_TSKW_614348.png

方法三

方法一没有普适性,方法二只能在生成的时候用,用Debug调试的时候没法用,因此建议用方法三。

当你编写非控制台程序时,比如GUI程序,像std::cout 和 printf()这样的函数,就无法使用了,(不是使用了,程序就编译不了,是可以通过编译的,只是你不会看到这些函数打印出的信息。) 
Visual Studio给我们提供了一个“控制台” — 输出窗口。我们要使用什么函数才能将调试信息打印到输出窗口里面呢? 看看下面的方法吧。

程序

#include "atlbase.h"
#include "atlstr.h"
void OutputDebugPrintf(const char *strOutputString, ...)
{
    char strBuffer[4096] = {0};
    va_list vlArgs;
    va_start(vlArgs, strOutputString);
    _vsnprintf_s(strBuffer, sizeof(strBuffer) - 1, strOutputString, vlArgs);
    //vsprintf(strBuffer, strOutputString, vlArgs);
    va_end(vlArgs);
    OutputDebugString(CA2W(strBuffer));
}
int main()
{
    int i = 10;
    OutputDebugPrintf("I'm %d years old.\n", i);
    while(1){}
    return 0;
}

OutputDebugPrintf()这个函数的使用方法,和printf()函数一样。

程序解释

#include "atlbase.h"
#include "atlstr.h"

这两个头文件是给这个CA2W()宏函数准备的。这个宏函数的功能是:将ANSI character string转化为Unicode character string的函数。

转载于:https://my.oschina.net/wangsifangyuan/blog/1499715

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值