Я работаю над встроенной платформой с ограниченными ресурсами. Я хочу макрос, который будет захватывать ошибки вызова функции и записывать их в буфер фиксированного размера.Макро, который разрешает первые N символов аргумента
Мое желание, чтобы быть в состоянии сделать что-то вроде
returnType retval;
CAPTURE_ERRORS(retval, function_name, argument1, moreArgsMaybe);
if (retval) { other_error_handling(); }
Где
#define N 12
#define CAPTURE_ERRORS(retval, func, ...) \
do { retval = func(__VA_ARGS__); \
if (retval!=0) write_log_entry(#func[0:N],(int)retval); \
} while (0)
Очевидно, что синтаксис ломтика Python не будет работать. Есть ли способ получить первые N символов аргументированного макроса?
(я не хочу, чтобы сделать усечение внутри write_log_entry
, потому что тогда все длинное имя функции будут сохранены в исполняемом образе, только чтобы быть выброшены позже.)
Вы можете записать только адрес функции, а затем использовать инструмент, используя свой файл карты, чтобы найти его. В зависимости от выравнивания и того, насколько большой ваш код, вы даже можете уйти только с части адреса функции, которая действительно изменяется. –
Я реализовал именно это. Мне было интересно, есть ли способ перейти непосредственно к строкам, чтобы избежать необходимости отслеживать старые файлы карт для каждой отправленной версии. – AShelly
Неужели вы так сильно занимаетесь дисковым пространством, что проблема с несколькими дополнительными символами имени функции в исполняемом изображении? – Barmar