Отладка данных в «анонимных пространствах имен» (C ++) - PullRequest
12 голосов
/ 26 августа 2009

Недавно я получил файл аварийного дампа от клиента. Я мог отследить проблему до класса, который мог содержать неверные данные, но я получил только void-указатель на класс, а не реальный указатель (void-указатель пришел из свойства окна, поэтому это был указатель void) , К сожалению, класс, на который я хотел привести указатель, находился в анонимном пространстве имен, например:

namespace
   {
   class MyClass
      {
      ...
      };
   }

...
void *ptr = ...
// I know ptr points to an instance of MyClass,
// and at this location I want to cast ptr to (MyClass *) in the debugger.

Использование «ptr» в окне просмотра, если Visual Studio 2005 просто показывает значение указателя. Если я использую "(MyClass *) ptr", отладчик говорит мне, что не может привести к нему.

Как я могу привести ptr к MyClass-указателю?

Примечание: я мог бы в конечном итоге использовать пространство имен с глупыми именами (например, имя исходного файла), а затем использовать «использование пространства имен», но я ожидал бы более эффективных решений.

Ответы [ 2 ]

9 голосов
/ 27 августа 2009

Это упоминается в MSDN . Не похоже, что в окне Watch есть хорошее решение (я думаю, вы можете получить оформленное имя вашего класса из списка).

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

2 голосов
/ 31 марта 2018

Ссылки на анонимные пространства имен в выражениях Visual Studio Debugger не поддерживаются (по крайней мере, начиная с VS 2017), и это действительно раздражает.

С https://docs.microsoft.com/en-us/visualstudio/debugger/expressions-in-the-debugger#c-expressions

Анонимные пространства имен не поддерживаются. Если у вас есть следующий код, вы не можете добавить test в окно просмотра:

namespace mars
{   
    namespace  
    {  
        int test = 0;   
    }   
}   
int main()   
{   
    // Adding a watch on test does not work.   
    mars::test++;   
    return 0;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...