强氧不';无法区分'union myname'和'struct myname'`

强氧不';无法区分'union myname'和'struct myname'`,c,doxygen,C,Doxygen,我写了一个小矩阵库,作为我正在进行的一个更大项目的一部分。零成本换位很重要,所以我使用/滥用了工会。代码本身工作正常(如下所示),但当使用Doxygen编写文档时,它将struct matrix\u r和union matrix\u r的所有文档合并到一个项目中。也就是说,只有为struct matrix\u r和struct matrix\u c生成的页面,但这两个页面将matrix\u r和matrix\u c描述为并集,带有连接的@short text和连接的属性(来自结构和并集声明) 我

我写了一个小矩阵库,作为我正在进行的一个更大项目的一部分。零成本换位很重要,所以我使用/滥用了工会。代码本身工作正常(如下所示),但当使用Doxygen编写文档时,它将
struct matrix\u r
union matrix\u r
的所有文档合并到一个项目中。也就是说,只有为
struct matrix\u r
struct matrix\u c
生成的页面,但这两个页面将matrix\u r和matrix\u c描述为并集,带有连接的@short text和连接的属性(来自结构和并集声明)

我对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;
#包括
///@行主矩阵的简短内部结构
结构矩阵{
int*data;//<原始指针支持矩阵
size\u t m;//<行数
大小\u t n;//<列数
};
///@列主矩阵的简短内部结构
结构矩阵{
int*data;//<原始指针支持矩阵
大小\u t n;//<列数
size\u t m;//<行数
};
///@brief面向用户的行主矩阵类型定义
typedef联合{
结构矩阵\u r id;//<矩阵的标识视图
结构矩阵_ctr;//<矩阵的转置视图
int*flat;//<矩阵的展平视图
}矩阵r;
///@brief面向用户的行主矩阵类型定义
typedef联合{
结构矩阵\u c id;//<矩阵的标识视图
结构矩阵\u r tr;//<矩阵的转置视图
int*flat;//<矩阵的展平视图
}矩阵c;

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

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

    A more detailed class description.
*/
直接从中,以下是一些其他命令:

此处使用特殊命令\类指示注释 块包含类测试的文档。其他结构 命令包括:

\结构来记录C结构

\工会记录工会

\枚举以记录枚举类型

\fn记录一个函数

\var来记录变量、typedef或枚举值

\def记录一个#define

\typedef用于记录类型定义

\文件来记录一个文件

\名称空间来记录名称空间

\包来记录Java包

\接口来记录IDL接口


编辑: 我相信这就是强氧的工作原理。见 此处的文档: 在“typedefs”一节中。它说:

涉及类、结构和联合的typedef,如

typedef结构结构名TypeName

为StructName创建别名,以便生成指向的链接 StructName,当遇到StructName本身或TypeName时

Doxygen认为联合标签名是“真实的东西”, 而不是typedef(它被认为是“真实”的别名) 事情”)。我建议:

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

虽然Doxygen可能是错误的(我不知道Doxygen),但您正在生成模糊的C,它有一个
struct matrix\u r
和一个类型
matrix\u r
。我强烈反对这种做法。在考虑过它之后,我会承认一点——我的初衷是,
struct matrix\u r
永远不会被用户直接使用,因此模糊了它的名称来阻止这种做法。然而,我现在已经将结构重命名为
matrix_r_repr
,这仍然通过
repr
表明它不是用于外部消费的,并且也消除了我的强氧问题。我刚才对另一个问题给出了大致相同的评论:-)()甚至明确地用\struct或\union标记它们,Doxygen错误地组合了文档条目。但是我没有看到它们在上面的程序中使用。为什么会这样?您是否尝试过分别对它们进行注释,而不是在一个
/***/
下对结构和联合进行注释<代码>/*\结构测试\结构测试的简短说明*//*\联合测试\联合测试的简短描述*/这不起作用。请检查我的编辑,问题是您使用的typedef。