#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
).