-1

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);
    }

} 
4

2 に答える 2

1

このような構造体には内部リンケージがあり、ほとんどの場合、デバッガーはそれらをテンプレート型パラメーターとして使用するのが違法であるのと同じ理由で、それを表示するのに問題があります。

ここでの唯一の解決策は、構造体をたとえば詳細名前空間に入れて、外部リンケージを与えることです。

于 2013-05-16T14:05:05.740 に答える
0

この問題の回避策は簡単です。

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 デバッガーを使用して構造体を検査しながら、構造体が属する場所 (実装の詳細) をきちんとカプセル化できます。スコープを少し制御できますが、これは利用可能な悪の中で最高のものです。

なぜデバッガーにこの問題があるのか​​ わかりません...

于 2013-05-16T18:32:27.953 に答える