2016-10-28 4 views
1

Я работаю над встроенной платформой с ограниченными ресурсами. Я хочу макрос, который будет захватывать ошибки вызова функции и записывать их в буфер фиксированного размера.Макро, который разрешает первые 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, потому что тогда все длинное имя функции будут сохранены в исполняемом образе, только чтобы быть выброшены позже.)

+2

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

+0

Я реализовал именно это. Мне было интересно, есть ли способ перейти непосредственно к строкам, чтобы избежать необходимости отслеживать старые файлы карт для каждой отправленной версии. – AShelly

+0

Неужели вы так сильно занимаетесь дисковым пространством, что проблема с несколькими дополнительными символами имени функции в исполняемом изображении? – Barmar

ответ

1

Я не знаю ни путь как строка. (Кто-то, кто знает, пожалуйста, просветите меня!)

Редактировать Самый простой способ я знаю, чтобы сделать все ваши имена функций не более N символов! Подумайте обо всем этом коде Fortran с N=6. :)

Второй простой способ я знаю, чтобы передать дополнительный параметр CAPTURE_ERRORS:

#define N 12 
            /* vvvv */ 
#define CAPTURE_ERRORS(retval, func, tag, ...) \ 
    do { retval = func(__VA_ARGS__); \ 
     if (!retval) write_log_entry(#tag,(int)retval); \ 
    } while (0)     /* ^^^^ */ 

и

CAPTURE_ERRORS(retval, function_name, function_nam, argument1, moreArgsMaybe); 
             ^^^^^^^^^^^^ 

Это достаточно ограниченная форма, что вы могли бы автоматически набивать tag в вашем существующий CAPTURE_ERRORS вызов с помощью скрипта Python (или даже sed!), который вы выполняете перед компиляцией.

Редактировать

  • discussion thread приходит к такому же выводу — использовать внешний инструмент.
  • В C++ вы могли бы сделать это во время компиляции с помощью шаблона. :) Не похоже на this question, но останавливаясь длиной N.
Смежные вопросы