Макрос C для переопределения назначения переменной с помощью вызова функции - PullRequest
1 голос
/ 14 января 2009

Вызов всех макро-гуру С ...

Есть ли способ написать макрос C, который заменит что-то вроде этого:

my_var = 5;

с этим:

setVar(&my_var, 5);

Другими словами, могу ли я написать макрос C, который переопределит присваивания для определенной переменной (в приведенном выше примере my_var) и вместо этого передаст его функции, задачей которой является установка этой переменной? Если возможно, я бы хотел иметь возможность подключаться к присваиваниям определенной переменной.


РЕДАКТИРОВАТЬ: Подумав об этом еще немного, я не уверен, что это может быть сделано. Даже если вы можете придумать макрос для этого, setVar не обязательно будет знать тип переменной, для которой она установлена, так что же будет типом ее второго аргумента?


РЕДАКТИРОВАТЬ: Причина, по которой я хотел бы перехватить назначения определенных переменных, заключается в использовании в примитивном отладчике для некоторого специализированного встроенного C-кода. Было бы неплохо иметь «список наблюдения», по сути, как у вас в IDE. Моим первым инстинктом было попытаться перехватить присваивание переменных макросом C, чтобы вы могли просто вставить макрос в ваш код и «посмотреть» эту переменную, но опять же я никогда раньше не писал отладчик, поэтому, возможно, я собираюсь об этом все неправильно.

Ответы [ 2 ]

3 голосов
/ 14 января 2009

Не со стандартным препроцессором. Он не может изменить синтаксический анализ файла, только заменить собственные имена на фрагмент кода (и «=» недопустимо в имени).

Если вы любите приключения, вы можете попробовать заменить исполняемый файл "cpp" небольшим скриптом, который предварительно обрабатывает исходный код. Но это может испортить информацию об отладке (имя файла и, если вы заменяете одну строку кода несколькими, тоже с информацией о номере строки). Сценарий назовет «sed» `:

sed -e 's/my_var\s*=\s*([^;]+);/MY_VAR(my_var, $1);/' file.c > file_tmp.c

Но, вероятно, лучше всего поместить это в скрипт и просто запустить его на всех ваших источниках. Это изменит код, и вы увидите, что происходит в вашем отладчике.

0 голосов
/ 30 июля 2012
#define setVar(_left_, _right_)    *(_left_) = _right_
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...