Если вы хотите поместить дополнительный код в вашу программу, которая запускается при изменении переменной, то нет - Standard C не предоставляет способ сделать это. Вы должны найти все места в вашей программе, которые могли бы попытаться изменить значение переменной, и добавить в каждый код какой-нибудь лог. Вы можете сделать это более надежным, переименовав переменную, а затем исправив точки, в которых компиляция прерывается, но это работает только в том случае, если вы можете перекомпилировать весь «клиентский» код, используя переменную: если переменная находится в библиотеке с множеством приложений других людей. используя его, это может быть непрактично.
Использование функций get / set для доступа ...
Иногда хорошей идеей является не писать код, который напрямую использует переменную, а вместо этого предоставлять функции, которые получают и устанавливают значение: тогда вы можете поставить дополнительные проверки или войти в эти функции, если это когда-нибудь станет полезным. Но вы не хотите делать это везде, иначе ваш код будет многословным и медленнее.
Проверка на наличие изменений в переменной ...
Если этого достаточно, чтобы время от времени проверять, то вы можете написать некоторый код, который запускается сигналом таймера / сигнала тревоги или запускается в другом потоке, который периодически проверяет переменную, чтобы увидеть, изменилась ли она, но это не поможет вам узнать, как оно изменилось, и если значение изменяется, но изменяется обратно, вы можете полностью пропустить эти изменения.
Использование C ++
Если вы компилируете свою программу на C ++ (если это возможно, что для небольших программ может даже не потребовать каких-либо изменений в вашем коде), то вы, возможно, можете изменить тип рассматриваемого элемента данных и написать перегруженную функцию operator=()
которая будет вызываться при назначении переменной и функции преобразования operator
старого типа ()
, поэтому места, где используется переменная, изменять не нужно:
template <typename T>
class Intercept
{
Intercept(const T& t) : t_(t) { }
T& operator=(const T& t) {
std::cerr << "change " << t_ << " to " << t << '\n'; t_ = t;
return *this;
}
operator T&() { return t_; }
operator const T&() const { return t_; }
T t_;
};
Затем измените, например,
int x; // from
Intercept<int> x; // to
Отладчик
Как говорит Дракоша, если это проблема отладки, вы можете запускать программу под отладчиком, пока не решите проблему.