2010-07-14 2 views
0

Я создал эту структуру данных:Странная проблема отладчика?

class Event 
{ 
public: 
    Event(EVENT_TYPE type, void* pSender = 0, int content1 = 0, 
     int content2 = 0, int content3 = 0, int content4 = 0); 
    ~Event(void); 

// ... some functions 

protected: 
    EVENT_TYPE itsType; 
    void* itsPointerToSender; 
    int itsContent_1; 
    int itsContent_2; 
    int itsContent_3; 
    int itsContent_4; 
    int numStacked; 
}; 

конструктор которого является просто

Event::Event(EVENT_TYPE type, void* pSender, int content1, int content2, int content3, int content4) 
    : itsType(type), 
    itsPointerToSender(pSender), 
    itsContent_1(content1), 
    itsContent_2(content2), 
    itsContent_3(content3), 
    itsContent_4(content4), 
    numStacked(0) 
{ 
} 

По какой-то странной причине я не могу понять, отладчик VS не может и не показать мне все, что содержится в itsContent_4 , Если я поставлю часы на переменную, itsContent_4 дает мне symbol "itsContent_4" not found, делая то же самое с itsContent_3. Я не уверен, что переменная даже существует в отношении компилятора!

Я что-то упустил?

Редактировать: Теперь кажется (даже страннее), что изменение порядка переменных в объявлении создает еще больший беспорядок! Я попытался поставить itsContent_4 до itsContent_1 и теперь itsContent_1 инициализируется значением, предназначенным для itsContent_4! Что здесь происходит? Я подозреваю, что что-то связано с наименованием, поэтому я попробую переименовать их все и посмотреть, что произойдет.

Edit 2: Да, по-видимому, изменение имен переменных itsContent_a вместо itsContent_1 и так далее работает отлично. Есть ли ограничение на использование чисел в имени переменной?

+0

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

+0

Определенно используется позже. И я все равно пытаюсь это сделать без оптимизации. –

+0

Нет ограничений на использование C++ для использования цифр в имени переменной (за исключением того, что они не могут запускать имя); все, что вы написали, выглядит отлично для меня C++. Вы можете сделать листинг с расширением препроцессора и проверить эти имена, если что-то странное происходит с макросами. Кроме этого, я в недоумении. –

ответ

3

Мне кажется, что отладчик использует неправильный файл .pdb. Инструменты + Параметры, Отладка, Общие, убедитесь, что «Требовать, чтобы исходные файлы соответствовали оригинальной версии».

Во время отладки с активной точкой останова используйте Debug + Windows + Modules и щелкните правой кнопкой мыши свой исполняемый файл в списке. Нажмите «Информация о загрузке символов», чтобы узнать, где отладчик нашел файл .pdb.

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

1

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

+0

Я в режиме отладки, но спасибо в любом случае. Проблема, похоже, возникает из-за числовых суффиксов переменных itsContent ... –

+0

Может ли быть какая-то макрозамена? У вас есть строка «content» #defined? –

+0

Всякий раз, когда я использую #define, я использую заглавные буквы, поэтому это не должно быть проблемой, и в любом случае не определяется ни «контент», ни «СОДЕРЖАНИЕ». Не знаю, никогда раньше не встречал ничего подобного. –

Смежные вопросы