如何在Visual Studio C++调试即时窗口中使用std::cout?

ehxuflar  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(532)

给定以下代码:

#include <iostream>

int main()

{

    std::cout << 5 << std::endl;
    std::cout << "Hello World!\n";

}

我在第二个cout处设置了断点,并在“即时窗口”中尝试

std::cout<<5<<std::endl;

上面写着:

identifier "std::cout" is undefined

我的主要目标是cout一个变量。对于int, double这样简单的变量,直接输入名称就可以打印出它的值。但是对于Eigen::Matrix, boost::json::object, torch::Tensor这样复杂的数据结构,就需要cout。如果我不能在即时窗口中使用cout,我就必须用代码编写cout,并且重新构建项目,这很不方便。

2eafrhcq

2eafrhcq1#

我提出了一个部分解决方案。首先创建一个函数return string,然后在即时窗口中调用它。在调试模式下:

#include <iostream>
#include<string>
#include<Eigen/Core>
template<typename T>
std::string str(const T& v)
{
    std::stringstream ss;
    ss << v << std::endl;
    return ss.str();
}

template std::string str<Eigen::MatrixXf>(const Eigen::MatrixXf& v);
int main()
{
    Eigen::MatrixXf m(3, 3);
    std::cout << str(m) << std::endl; //Set a breakpoint here.
}

然后在“立即”窗口中:

str<Eigen::Matrix<float,-1,-1,0,-1,-1> >(m)

将打印结果字符串。注意> >中的空格。符号str<Eigen::Matrix<float,-1,-1,0,-1,-1> >可在Disassembly窗口中找到。
看起来我们可以调用一个有地址的函数。如果它已经被优化了,我们就不能调用它。
经过一些测试,我发现如果有一个成员函数返回一个字符串,那么我可以直接调用该成员:

#include <iostream>
#include<string>
struct A
{
    int y = 5;
    std::string str() { return std::to_string(y); }
};
int main()
{
    A a;
    std::cout << a.str() << std::endl;
}

cout处设置断点,然后在即时窗口中,我可以调用

a.str()

但这仍然没有完全达到我的目标。

woobm2wo

woobm2wo2#

要在即时窗口中打印:
1.在工具-〉选项-〉调试-〉常规中设置Redirect all output window text to the immediate window,通过Visual Studio Search查找该选项会更方便。
1.#包括<windows.h>
1.在代码段中使用OutputDebugStringA
要检查变量的值:添加断点并右击变量-〉添加监视。参见Watch variables

相关问题