2013-05-16 1 views
-1

VS2008 Отладчик C++ кажется неспособным/не желающим заглядывать внутрь экземпляров структур, определенных внутри функции, когда эти экземпляры (или ссылки на) объявляются в другой области с той, где определена вложенная структура (например, цикл for). Любая идея, почему это так?VS2008 Отладчик C++ кажется неспособным/не желающим смотреть внутри экземпляров структур, определенных внутри функции. Как люди отлаживают такой код?

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

} 
+1

Я думаю, что это безопасно предположить, что большинство людей * are't * отладка такого кода, потому что они просто не писать такой код. –

+0

Это и неправильно, и бесполезно – OldSchool

+0

Итак, у вас есть доказательства того, что большинство людей пишет такой код? –

ответ

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 отладчика. Вы отдаете немного контроля над областью, но это лучшее из доступных зла.

Почему отладчик имеет этот вопрос, я не знаю ...

0

Такие имеют внутреннюю Структуры связи, и почти наверняка отладчик имеет проблемы с просмотром его по той же причине, что это незаконно, чтобы использовать их в качестве параметров типа шаблона.

Ваше единственное решение здесь может заключаться в том, чтобы структурировать, например, пространство имен деталей, чтобы придать ему внешнюю связь.

+0

Спасибо, Марк, я бы проголосовал за тебя, если бы у меня был представитель. В ожидании увидеть, какие другие ответы могут возникнуть у людей, прежде чем я приму. – OldSchool

+0

Привет, Марк, что вы думаете в свете отредактированного вопроса? – OldSchool

+0

@ Mark.B, посмотрите на обходной путь в моем ответе, в свете этого, я думаю, что это ошибка/ограничение VS2008. – OldSchool