На сайте вызова (то есть, когда выполняется вызов foo
) это практически невозможно сделать.
В самой функции вы можете сделать это, имея виртуальную функцию, одна из которых вернет true
. Все остальные вернутся false
. Если функция возвращает true
, вы можете вызвать саму функцию DebugBreak
. Или поместите возвращаемое значение в некоторую переменную bool
и установите условную точку останова. Да, конечно, для этого требуется добавить виртуальную функцию во все классы (или некоторые). Кроме того, в базовом классе может быть одна простая переменная bool
, которая будет назначена производным классом. Соответствующий производный класс (C
в вашем случае) может назначить его как true
. Вы можете сделать этот виртуальный / переменный материал в режиме отладки только с помощью макроса _DEBUG
.
Другое решение состоит в том, чтобы иметь макрос, который будет вызывать функцию foo
. Реализация требует наличия виртуальной функции / переменной-члена в базовом классе, как описано выше, но foo
не будет изменено.
#define CALL_FOO(obj) \
if(obj->member_variable_test) DebugBreak(); \
foo(&obj);
И позвоните CALL_FOO
вместо foo
:
CALL_FOO(&c); // breakpoint is hit
Хотя это может быть неприемлемо, но работает. И точка останова попадает именно туда, где вам нужно!
Вы можете заставить этот макрос работать только в debug-build.