LINUX.ORG.RU

C: подмена макроса


0

0

Есть сишная библиотека с исходниками. В определенных ее местах надо с помощью банального printf() выводить отладочную информацию, который имеет альяс "show_debug()" (макрос). Необходимо, что бы при использовании этой библиотеки (на этапе компиляции) сторонний программист мог переопределить данный printf() своей, семантически похожей, функцией. Вопрос: как это наиболее _правильно_ сделать? Спасибо.

P.S. Да, возможности препроцессора C мне известны, однако меня интересует именно архитектура данного решения.

anonymous

А насколько корректен такой вариант?

 Сделать debugging.h с  контентом:
   #ifdef OWN_DEBUG_FILE
    #include "OWN_DEBUG_FILE"
   #endif

   #ifndef show_info
     #define show_info(fmt, ...) printf(fmt, _VA_ARGS_);
   #endif

Включить этот header во все файлы библиотеки,
где предполагается использование соответствующей функции.
А при использовании библиотеки  создать свой my_debugging.h:
    #define show_info(fmt, ...)  my_handler(fmt, _VA_ARGS_);

И при компиляции проекта делать так:
 gcc ... -DOWN_DEBUG_FILE="my_debugging.h"


Насколько это правильно и архитектурно красиво?
Единственное, что анноит тут, это передача имени .h файла
через -D ключ.

   

anonymous
()
Ответ на: комментарий от fghj

> там есть всякие g_log, g_debug и способ их заменить

Там все это делается в рантайме (*_set_handler()). Меня же интересует именно замена на стадии компиляции. Что можете сказать про предыдущий вариант? Выглядит интересно, но не кривой ли это способ? Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

> Выглядит интересно

выглядит канонически. это общепринятая техника.

> но не кривой ли это способ?

нет. посмотрите на любое мало-мальски нормальное сёвое приложение, там спошь и рядом такие вещи.

asgard
()
Ответ на: комментарий от asgard

> нет. посмотрите на любое мало-мальски нормальное сёвое приложение, там спошь и рядом такие вещи.

Вот только при использовании этого метода сразу же вылезет грабля. Например, нужно подменить show_info() другой функцией, которая должна быть обязательно инициализирована в main(). Соответственно встает вопрос: как сказать библиотеке (о которой идет речь в первом посте топика) использовать _уже_ проинициализированную функцию из main()? Можно попробовать вынести это в отдельный хидер, но это уже кривость получается, imho.

Под инициализацией я понимаю, например, инициализацию какого-нибудь ресурса, который юзерская show_info() использует.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.