Использование Doxygen правильно - PullRequest
8 голосов
/ 15 апреля 2010

Я пытался документировать свой проект на C ++, используя Doxygen, но с небольшим успехом: Doxygen с ошибками распознает определенные макросы, и, следовательно, целые функции неправильно интерпретируются, и большую часть времени не генерируют документы, даже если у них есть специальные блоки комментариев.Пример:

/**
 * \def      __MYLIB_FUNCTION_ATTRIBUTE(...)
 * \brief    Some brief comment
 * \details  Detailed doc
 * \sa       Some valid references
 */
#define __MYLIB_FUNCTION_ATTRIBUTE(...)    __attribute__(__VA_ARGS__)

/**
 * \def      IN
 * \brief    Tag for input arguments to a function
 * \details  Blah...
 * \sa       OUT
 */
#define IN

/**
 * \def      OUT
 * \brief    Tag for output arguments to a function
 * \details  Blah...
 * \sa       IN
 */
#define OUT

class MyClass {
public:

    /**
     * \fn        MyClass()
     * \brief     Constructor for MyClass
     * \details   Hi!
     */
    __MYLIB_FUNCTION_ATTRIBUTE(__always_inline__)
    MyClass() {
    }

    /**
     * \fn        const char *doNothing(const char *s IN)
     * \brief     A weird function
     * \details   Some very weird doc
     * \param[in] s No good parameter
     */
    const char* __SXC_FUNCTION_ATTRIBUTE(__const__) doNothing(const char *s IN) {
        return s;
    }
};

В документации, созданной для вышеуказанного класса, всегда отсутствует описание для doNothing, а IN интерпретируется как функция!Я что-то здесь не так делаю?

1 Ответ

4 голосов
/ 15 апреля 2010

Две вещи:

1) Анализатор Doxygen не «видит» «IN» в doNothing (поскольку он удаляется на этапе предварительной обработки), поэтому \ fn не должен включать его: const char* doNothing(const char* s). Кстати, в этом \ fn нет необходимости: Doxygen автоматически связывает комментарий, если он находится непосредственно перед документированным объектом.

2) Я не знаю, во что расширяется __SXC_FUNCTION_ATTRIBUTE, но, если это что-то похожее на __MYLIB_FUNCTION_ATTRIBUTE, это, вероятно, смущает Doxygen. В качестве обходного пути вы можете либо ничего не определять в этих макросах в разделе PREDEFINED файла конфигурации Doxygen, либо условно определять их в источниках, например:

#ifdef DOXYGEN
// Doxygen does not grok the normal definition of this
#define  __MYLIB_FUNCTION_ATTRIBUTE(...)
#else
#define __MYLIB_FUNCTION_ATTRIBUTE(...)    __attribute__(__VA_ARGS__)
#endif

и поместите PREDEFINED = DOXYGEN в файл конфигурации.

...