在用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窗口的输出信息:
方法三
方法一没有普适性,方法二只能在生成的时候用,用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的函数。