VS2008 c++调试器似乎无法/不愿意查看函数中定义的结构的内部实例.人们是如何调试这些代码的?

VS2008 C++ debugger seems unable/unwilling to look inside instances of structs defined within a function. How are people debugging such code?

本文关键字:何调试 实例 代码 调试 内部 结构 c++ 调试器 不愿意 定义 函数      更新时间:2023-10-16

VS2008 c++调试器似乎无法/不愿意查看在函数中定义的结构的实例,当这些实例(或引用)在与定义嵌套结构的不同范围内声明时(例如for循环)。知道为什么会这样吗?

void MyClass::doSomething()
{
    struct NestedStruct
    {
        int usefulMetaInfo
        vector<double> data;
    };
    //WORKS - Debugger can see inside ns
    NestedStruct ns;
    ns.data.push_back(1);
    //FAILS - Debugger cannot see inside ns
    for{int i=0;i<1;i++}
    {
        NestedStruct ns;
        ns.data.push_back(1);
    }
} 

这样的结构体具有内部链接,并且几乎可以肯定调试器在查看它时遇到麻烦,原因与将它们用作模板类型参数是非法的相同。

您唯一的解决方案可能是将结构体放入例如detail命名空间中,以便为其提供外部链接。

解决这个问题的方法很简单。

确保NestedStruct的所有句柄都声明在与NestedStruct定义相同的作用域中。请注意,这通常需要使用指针句柄而不是引用(例如,当您希望迭代NestedStruct容器时)。

void MyClass::doSomething()
{
    struct NestedStruct
    {
        int usefulMetaInfo
        vector<double> data;
    };
    NestedStruct ns*; //declare here
    for{int i=0;i<1;i++}
    {
        //NestedStruct ns*; //DON'T declare here
        ns = someContainer[i];
        ns->data.push_back(1);
    }
} 

这将允许您将结构整齐地封装在它所属的位置(实现细节),同时仍然能够使用VS2008调试器检查它。你放弃了一点对范围的控制,但这是最好的。

为什么调试器有这个问题我不知道…