Условная компиляция Doxygen не создает документацию

#doxygen #conditional-compilation

#doxygen #условная компиляция

Вопрос:

Я относительный новичок в doxygen и документирую программу на C

Часть кода является:

 #include "options.h"
// options.h contains
#define VAL0 0   // Possible values for PARAM
#define VAL1 1
#define PARAM VAL0

// Here's the conditional compilation
#if (PARAM == VAL0)
// code chunk, which doesn't get compiled by Doxygen
#endif
  

Код компилируется с помощью GCC, как и ожидалось, но я не получаю документацию Doxygen

Хорошо, Doxygen не расширяет макросы, поэтому я попытался:

 #define SYMEQ(A, B) (A == B) ? 1 : 0

#if SYMEQ(PARAM, VAL0)

// code chunk

#endif
  

Установите Doxygen:

MACRO_EXPANSION = ДА

EXPAND_ONLY_PREDEF = ДА

Нет предопределенных макросов

EXPAND_AS_DEFINED = SYMEQ

Нет вывода doxygen из условной части, только до нее

Я также попробовал EXPAND_AS_DEFINED SYMEQ(A, B)

Также не повезло

Я нашел несколько примеров с простыми именами, затем #ifdef NAME code #endif, но ни одного с макрофункциями

Ответ №1:

У меня просто возникла проблема #ifdef CONDITION code not compiled by doxygen #endif , и я исправил ее с помощью грубой силы, т. Е. добавив условия к настройке PREDEFINED=CONDITION1 CONDITION2 ... вручную.

Я попробовал решение с заголовочным файлом — сгенерировать файл с условиями и включить его, установив SEARCH_INCLUDES , INCLUDE_PATH и INCLUDE_FILE_PATTERNS — но это не сработало. Из руководства по doxygen, я думаю, требуется явно #include "the condition file" указывать исходные файлы, что означает изменение исходного кода, поэтому я сдаюсь.

SEARCH_INCLUDES: Если для тега SEARCH_INCLUDES установлено значение YES (по умолчанию), будет выполнен поиск по включаемым файлам в INCLUDE_PATH (см. Ниже), если найден #include.

Комментарии:

1. Добавление путей включения было правильным. Это делается путем включения SEARCH_INCLUDE опции и последующего добавления путей в INCLUDE_PATH список.

Ответ №2:

MACRO_EXPANSION и EXPAND_ONLY_PREDEF управляйте только тем, будет ли макрос расширен в вашем коде, а не тем, как он будет оцениваться в блоках условного препроцессора. Например, если у вас был код, подобный:

 #define RET_TYPE int

/**
 * Some function
 */
RET_TYPE func(void);
  

С MACRO_EXPANSION=NO , это будет задокументировано doxygen как RET_TYPE func(void) , макрос не расширяется. С помощью MACRO_EXPANSION=YES это будет задокументировано как int func(void) , макрос расширяется и результирующая подпись документируется.

Для управления условным кодом вам нужно сосредоточиться на ENABLE_PREPROCESSING . Если для этого параметра установлено значение NO , условный код будет проигнорирован, и весь код в пределах условия будет задокументирован. Если для него установлено значение YES , будет вычислен условный код, и будут документированы только блоки, для которых условие соответствует. В этом случае вам нужно убедиться, что все оцениваемые значения определены правильно, этого можно добиться, разрешив doxygen оценивать включаемые файлы (см. SEARCH_INCLUDES , INCLUDE_PATH и INCLUDE_FILE_PATTERNS опции) или предварительно определив для макросов определенное значение (см. PREDEFINED ).