X-macro breaks doxygen callgraph

У меня 3 файла:

test.c

int table[] = { #define X(val) val, #include "test.x" #undef X }; void level2(void) { level3(); level4(); } void level3(void) { level4(); } 

test2.c

 void level1(void) { level2(); level3(); level4(); } void level4(void) { } 

test.x

 X(1) X(2) X(3) 

Я использую doxygen для создания callgraphs для этих функций. Вот что я ожидал:

  • 1-й уровень:
    • Ссылки level2 (), level3 () и level4 ().
  • уровень 2:
    • Ссылки level3 () и level4 ().
    • Ссылка на уровень1 ().
  • Уровень 3:
    • Ссылки level4 ().
    • Ссылка на уровень 1 () и level2 ().
  • level4:
    • Ссылка на уровень 1 (), level2 () и level3 ().

Но вот что я получил:

  • 1-й уровень:
    • Ссылки level2 (), level3 () и level4 ().
  • уровень 2:
    • Ссылка на уровень1 ().
  • Уровень 3:
    • Ссылка на уровень1 ().
  • level4:
    • Ссылка на уровень1 ().

Кажется, что X-macro на test.c является виновником. Мне удалось заставить его работать, делая 2 вещи (либо сделайте):

  1. Переименование test.x поэтому doxygen не находит его. Он покажет предупреждение, но callgraph верен.
  2. Добавление конечной новой строки в конце test.x Обычно файл заканчивается сразу после X(3) .

Вопрос:

Как я могу получить надежный callgraph из doxygen без редактирования файлов? Есть ли настройка, которую мне нужно изменить, или эта простая ошибка?

    У меня был опыт работы с xmacros. В общем, Doxygen будет обрабатывать macros как правильные декларации и фактически не обрабатывать их. Для того, чтобы работать с макросами (и это включает в себя x-macros). В общем:

    1. Установить MACRO_EXPANSION=yes
    2. Либо установите EXPAND_ONLY_PREDEF=yes (что сделает Doxygen расширением всех макросов) или
    3. Добавьте имя своего макроса в EXPAND_AS_DEFINED .

    Кроме того, обратите внимание на это: http://www.stack.nl/~dimitri/doxygen/manual/config.html#cfg_skip_function_macros

    Чтобы дать вам представление о возможностях с помощью xmacros и Doxygen, я могу создать соответствующую документацию из этого: https://github.com/couchbase/libcouchbase/blob/master/include/libcouchbase/error.h#L95