Doxygen не делает различий между `union myname` и`struct myname`

Я написал небольшую матричную библиотеку как часть большого проекта, над которым я работаю. Было важно иметь транспонирование с нулевой стоимостью, поэтому я использовал / злоупотреблял профсоюзами. Сам код работает нормально (приведен ниже), но когда он пришел к документу с Doxygen, он объединяет всю документацию для обоих struct matrix_r а также union matrix_r в один элемент. То есть есть только сгенерированные страницы для struct matrix_r а также struct matrix_c, но эти две страницы описывают matrix_r и matrix_c как объединения, с объединенным @brief текстом и объединенными атрибутами (как из объявлений struct, так и из union).

Я очень, очень плохо знаком с Doxygen, но до сих пор не смог понять, как заставить его рассматривать их как отдельные элементы документации. Есть идеи?

#include <stddef.h>

/// @brief internal stuct for row-major matrices
struct matrix_r {
    int *data; ///< raw pointer backing matrix
    size_t m;  ///< the number of rows
    size_t n;  ///< the number of cols
};

/// @brief internal struct for col-major matrices
struct matrix_c {
    int *data; ///< raw pointer backing matrix
    size_t n;  ///< the number of cols
    size_t m;  ///< the number of rows
};

/// @brief user-facing typedef for row-major matrices
typedef union {
    struct matrix_r id;   ///< identity view of matrix
    struct matrix_c tr;   ///< transposed view of matrix
    int*            flat; ///< flattened view of matrix
} matrix_r;

/// @brief user-facing typedef for row-major matrices
typedef union {
    struct matrix_c id;   ///< identity view of matrix
    struct matrix_r tr;   ///< transposed view of matrix
    int*            flat; ///< flattened view of matrix
} matrix_c;

1 ответ

Решение

Структурные команды начинаются с обратной косой черты (\), или же (@) сопровождается именем команды и одним или несколькими параметрами. Например, если вы хотите задокументировать класс Test, вы могли бы поместить следующий блок документации куда-нибудь во входные данные, которые читает doxygen:

/*! \class Test
    \brief A test class.

    A more detailed class description.
*/

Прямо из руководства, вот некоторые другие команды:

Здесь специальная команда \class используется, чтобы указать, что блок комментария содержит документацию для класса Test. Другие структурные команды:

\ struct для документирования C-структуры.

\ союз, чтобы зарегистрировать союз.

\ enum для документирования типа перечисления.

\ fn для документирования функции.

\ var для документирования переменной или typedef или значения перечисления.

\ def для документирования #define.

\ typedef для документирования определения типа.

\ файл для документирования файла.

\ namespace для документирования пространства имен.

\ package для документирования пакета Java.

\ интерфейс для документирования интерфейса IDL.


Изменить: я считаю, что именно так Doxygen предназначен для работы. Смотрите документацию здесь: http://www.doxygen.nl/autolink.html в разделе "typedefs". Это говорит:

Typedefs, которые включают в себя классы, структуры и союзы, такие как

typedef struct StructName TypeName

создайте псевдоним для StructName, чтобы ссылки были сгенерированы на StructName при обнаружении либо самого StructName, либо TypeName.

Doxygen считает имя тега объединения "реальной вещью", а не typedef (который рассматривается как псевдоним "реальной вещи"). Я бы порекомендовал это:

/*!@brief The documentation of the union Name*/ 
typedef union Name 
{ 
    //..... 
}Name; 
Другие вопросы по тегам