Точки останова во встроенной функции не ударили

У меня есть класс, объявленный следующим образом:

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass : public MyOtherClass
{

public:
MyClass();

int a() const{ return _a; };
int b() const{ return _b; };

private:
int _a;
int _b;
};

inline bool operator==( const MyClass& lhs, const MyClass& rhs )
{
return (lhs.a() == rhs.a()) && (lhs.b() == rhs.b());
}

#endif

Моя проблема в том, что любые точки останова установлены в перегруженном operator== никогда не попадет в цель, Visual Studio даже скажет мне, что выполнение никогда не достигнет этой функции. Я следовал этот Эмпирическое правило для перегрузки операторов сравнения, но в нем не упоминается ничего, кроме как сделать их не-членами, поэтому я не уверен, что я что-то упустил с перегрузкой операторов или встроенными функциями.

Может кто-нибудь сказать мне, почему мои контрольные точки никогда не бьют?

5

Решение

Ваши точки останова никогда не достигаются, потому что компилятор вставляет код. Установка точки останова внутри этой встроенной функции может означать установку сотен или тысяч «виртуальных» точек останова. Отслеживание того, какой код встроен, где слишком много работы для IDE, поэтому в результате этого нет.

Чтобы обойти проблему, либо запустите отладку (где, я думаю, вставка не произойдет), либо не включайте функцию.

Вы также можете скомпилировать с флагом / Od, чтобы отключить встраивание, а также все другие оптимизации (что и происходит при отладке).

Установка флага / Ob0 должна запретить встраивание. Однако из соображений производительности рекомендуется не делать это часто, поэтому лучше всего работать в режиме отладки.

10

Другие решения

Так как OP упомянул, что он использует режим отладки с VS, я попытался повторить это & это может быть воспроизведено.

1>Remove /ZI flag  (no debug infomration) but set it /Zi instead.
2>Disable /Od flag (so no inline) & set it to /Od2.

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

Итак, Крис Уилсон, не могли бы вы пойти в собственность вашего проекта и убедиться, что у вас есть

1>/ZI flag is set.
2>/Od flag is disabled.

Если вы не знаете, как это сделать, проверьте эти две ссылки MSDN ниже на наличие этих двух флагов.

http://msdn.microsoft.com/en-us/library/47238hez(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/958x11bc(v=vs.80).aspx

3

inline не означает, что тело функции будет встроено в каждый сайт вызова. На самом деле, функция может быть встроена компилятором, даже если она не определена явно inline, И одна функция может быть встроена в один сайт вызова и вызываться нормально на другом сайте вызова. Эта директива — просто подсказка компилятору. Отладчик Visual Studio прекрасно работает с встроенными функциями.

Я думаю, что эта проблема не вызвана inline директивы. Попробуйте удалить эту директиву и запустить код под отладчиком. И это очень удобно для написания модульного теста для подобных случаев.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector