X-macro ломает коллграф doxygen

У меня есть 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 для создания графиков вызовов для этих функций. Вот что я ожидал:

  • level1:
    • References level2(), level3(), and level4().
  • level2:
    • References level3(), and level4().
    • На него ссылается level1().
  • level3:
    • References level4().
    • На него ссылаются level1() и level2().
  • level4:
    • Referenced by level1(), level2(), and level3().

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

  • level1:
    • References level2(), level3(), and level4().
  • level2:
    • Referenced by level1().
  • level3:
    • Referenced by level1().
  • level4:
    • Referenced by level1().

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

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

Вопрос:

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


person user694733    schedule 13.02.2015    source источник


Ответы (1)


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

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

Кроме того, обратите внимание на следующее: http://www.doxygen.nl/manual/config.html#cfg_skip_function_macros

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

person Mark Nunberg    schedule 13.02.2015
comment
В данном конкретном случае документы по X-макросам мне не пригодятся, мне нужны были только callgraphs. Однако, когда я проверил ваше предложение, я также нашел ENABLE_PREPROCESSING, который, когда он отключен, похоже, делает свое дело. Это решение не является оптимальным, но лучшим на данный момент. Спасибо, что направили меня в правильном направлении. Если никто не опубликует другие альтернативы, я выберу этот ответ. - person user694733; 13.02.2015
comment
Хрм. В самом деле, в вашем случае вы специально не хотите, чтобы макросы рассматривались как макросы, а скорее как функции! - person Mark Nunberg; 13.02.2015