【问题标题】:Doxygen doesn't distinguish between `union myname` and `struct myname`Doxygen 不区分 `union myname` 和 `struct myname`
【发布时间】:2018-05-09 01:38:21
【问题描述】:

我编写了一个小型矩阵库,作为我正在进行的一个更大项目的一部分。零成本转置很重要,所以我使用/滥用了工会。代码本身可以正常工作(在下面提供),但是在使用 Doxygen 进行文档处理时,它将struct matrix_r union matrix_r 的所有文档合并到一个项目中。也就是说,只有struct matrix_rstruct matrix_c 的生成页面,但是这两个页面将matrix_r 和matrix_c 描述为联合,具有连接的@brief 文本和连接的属性(来自结构和联合声明)。

我对 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;

【问题讨论】:

  • 虽然 Doxygen 可能是错误的(而且我不知道 Doxygen),但您正在制作混淆 C,具有 struct matrix_r 和类型 matrix_r。我强烈反对这样做。
  • 睡过之后,我会承认这一点——我的初衷是struct matrix_r 永远不会被用户直接使用,因此隐藏它的名字来阻止它。但是,我现在已将结构重命名为 matrix_r_repr,这仍然通过 repr 表明它不用于外部消耗,也消除了我的 Doxygen 问题。
  • 我刚刚在这里对另一个问题给出了相同的评论 :-) (stackoverflow.com/questions/47487387/…)

标签: c doxygen


【解决方案1】:

结构命令以反斜杠(\)(@) 开头,后跟命令名称和一个或多个参数。例如,如果您想记录类 Test ,您可以将以下文档块放在 doxygen 读取的输入中的某个位置:

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

    A more detailed class description.
*/

直接来自manual,这里有一些其他命令:

这里使用特殊命令\class来表示注释 块包含类测试的文档。其他结构 命令是:

\struct 记录一个 C 结构。

\union 记录一个联合。

\enum 记录枚举类型。

\fn 记录一个函数。

\var 记录变量或 typedef 或枚举值。

\def 记录一个#define。

\typedef 记录类型定义。

\file 记录一个文件。

\namespace 记录命名空间。

\package 记录一个 Java 包。

\interface 记录 IDL 接口。


编辑: 我相信这就是 Doxygen 设计的工作方式。见 此处的文档: http://www.doxygen.nl/autolink.html 在“typedefs”部分。它说:

涉及类、结构和联合的类型定义,例如

typedef struct StructName TypeName

为 StructName 创建一个别名,以便生成链接到 StructName,当遇到 StructName 本身或 TypeName 时。

Doxygen 认为 union 标签名称是“真实的”, 不是 typedef (它被认为是“真实的 事情”)。我推荐这个:

/*!@brief The documentation of the union Name*/ 
typedef union Name 
{ 
    //..... 
}Name; 

【讨论】:

  • 即使使用 \struct 或 \union 明确标记它们,Doxygen 也会错误地组合文档条目。
  • 但我没有看到它们在您上面的程序中使用。为什么这样 ?您是否尝试过单独评论它们,而不是 /* */ 下的结构和联合
  • 你试过了吗? /*! \struct test \brief short description for struct test */ /*! \union test \brief short description for union test */ 这不起作用。
  • 检查我的编辑,问题是你使用的 typedef。
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 2016-03-12
  • 2011-11-14
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多