如何使用Doxygen生成“全局文档”

3

我对如何记录代码以及使用@mainpage@page@subpage等相关标签编写“通用文档”有相当了解。

我需要将要求/规范文档包含到代码中。

我的问题是如何将这种文档(概念上与代码文档不同)保持靠近实现功能的代码(即:至少在同一文件中,有时甚至靠近特定类/函数/方法),但仍能有序地收集它并在@mainpage或其他@subpage中呈现。

我理想情况下需要的是能够在各种源文件中随机放置特定的@page@section@subsection等,然后能够按特定顺序@include它们到@mainpage或某些其他@subpage

更好的做法是能够在类/函数完整文档(不是@brief)和“前置内容”中包括相同的片段,该片段链接到@mainpage

我需要的全局效果是有一个“规范文档”,其中详细说明了代码的各个部分需要实现什么,然后是 Doxygen 产生的“常规类/函数/其他”文档。

问题在于我希望将“规范”和实现放在源代码中,并将它们分开记录,即:

  1. 总体描述:简单,这可以放到@mainpage
  2. 要求:最有可能放在实现它们的源文件顶部,如何链接/包含在主页?
  3. 规范:放在要求之后的文件顶部或某个接近实现的类/函数位置;同样,在此处我不知道如何链接/包含在“前置内容”中,也就是@mainpage中。
  4. 常规代码文档:这里唯一不知道的是如何在类/函数说明中包括已用于(2)和(3)的相同“文档片段”。

这个是否可行?

如果可行,那么最佳实践是什么?

注意:我可以使用单独的文件来处理每个“文档片段”,然后在正确的位置进行@include,但这将背离整个目的,即将要求/规范/代码聚合在一起,同时将它们分开在生成的不同文档部分中。

更新:根据@albert的评论,我尝试了以下操作:

  • 在标准的Doxygen注释中添加了标记:
/**
 * Initialization function.
 *
 * [AM_init]
 * It needs to do a long series of tests to ensure AM can actually work.
 *
 * It should also allocate all dynamic memory needed to avoid runtime failures.
 *
...
 * It will be responsibility of system-level daemon to take appropriate action.
 * [AM_init]
 *
 *
 * @param ip_addr
 * @param port
 * @return
 */
static uint32_t AM_init(const char* ip_addr, uint16_t port) {
...
  • 在我所定义的“前置事项”中(除其他事项外):
/**
@page __init Initialization
@snippet{doc} CommandHandler.c AM_init
*/
  • 函数文档已正确渲染(即:标记已被删除)
  • 另一方面,初始化页面“有些不完整”:

Initialization

    It needs to do a long series of tests to ensure AM can actually work.

就是这样。

显然,标签is被找到了,但实际上只包括了第一行。

进一步更新:根据@albert的回答(已接受),我成功了,但有以下注意点:

  • 所包含的片段([AM_init])必须是一个标准注释,而不是Doxygen注释,否则片段会被包含两次。
  • 所包含的片段不能有前导符号*(在“标准注释”中非常常见)。
  • 所包含的注释应该具有HTML控件(例如:用于行结束的<br/>),因为Markdown构造(在上面的情况下是“双换行符”)被识别。

回过头来看看,我认为Doxygen \snippet['{'option'}'] <file-name> ( block_id )文档中的“注意事项”,或多或少地解决了以上问题,但我觉得它很难懂,并且如果没有亲身经历,我永远不可能理解其中的影响。

最后一个问题非常恼人,因为我使用了许多列表和表格,尽管HTML语法更加强大,但写起来和阅读起来也更加困难。

找到一种解决这个限制的方法会是“非常好的”。


你使用的是哪个版本的Doxygen?可以举个小例子说明你想要实现什么吗?你看过像 \snippet 这样的命令吗? - albert
@albert:我目前正在使用“Doxygen版本1.9.1”,但我可以随时更改到需要的任何版本,包括从最新版本编译。 @snippet 不是我需要的;据我所知,它是用于在文档中包含一些代码片段,而不是我需要的内容。 “小例子”相当困难,但我会更新OP以澄清。 - ZioByte
\snippet 命令也有 doc 选项,因此可以使用 \snippet{doc}\snippetdoc。我认为通过 \snippet{doc} 选项,你可以实现你想要的功能。 - albert
@albert:看起来它似乎不起作用。我会更新原始帖子以澄清。 - ZioByte
1个回答

1

使用以下代码和当前的doxygen版本(1.9.4(5d15657a55555e6181a7830a5c723af75e7577e2)),但也适用于1.9.1(ef9b20ac7f8a8621fcfc299f8bd0b80422390f4b)版本,我得到了良好的结果:

bb.h

/// \file

/**
@page __init Initialization
@snippet{doc} CommandHandler.c AM_init
*/

CommandHandler.c

/// \file

/**
 * Initialization function.
 */

/* [AM_init]
   It needs to do a long series of tests to ensure AM can actually work.<br>

   It should also allocate all dynamic memory needed to avoid runtime failures.<br>

   It will be responsibility of system-level daemon to take appropriate action.<br>
   [AM_init]
 */
/**
 * \snippet{doc} this AM_init
 *
 * @param ip_addr
 * @param port
 * @return
 */
static uint32_t AM_init(const char* ip_addr, uint16_t port){}

Doxyfile

EXTRACT_STATIC = YES
EXAMPLE_PATH = .
QUIET = YES

注意:OP在进一步更新中提到有些事情需要注意:
  • 包含的代码片段([AM_init])必须在标准注释中,而不是doxygen注释中,否则代码片段将会被包含两次。
  • 包含的代码片段不能有前导*(在“标准注释”中很常见)。
  • 包含的注释应该有HTML控件(例如:使用
    进行换行),因为Markdown结构(如上面的“双换行符”)不能被识别。

我接受了这个答案,但你可能需要更新一下来解决我的问题(请参见OP中的“进一步更新”)。谢谢。 - ZioByte
1
事实上,注释必须是标准注释,适用于\snippet{doc}且不带*,这很不幸。不能使用*并且需要使用<br>的事实让我感到惊讶,不允许使用*在文档中有点隐晦地提到:“包含的文档不应该有注释符号,因为它们也会出现在文档中。” <br>问题可能是可以解决的(即通过在片段上运行markdown),但这必须得到适当的调查。 - albert
如果你碰巧找到了一种“在片段上运行markdown”的方法,请在这里添加评论,以便我可以收到通知(我不知道如何获得该功能)。我并不是Doxygen专家(远远不是!),但我计划在一些项目中大量使用它。我还在推动公司更广泛地使用它,这种“不一致性”是一个很大的拖累。再次感谢! - ZioByte
虽然这并不能帮助你,但问题不在于Markdown处理,而是(Markdown处理生成的输出看起来没问题)。 - albert
在doxygen问题跟踪器中创建了一个问题:https://github.com/doxygen/doxygen/issues/9365 - albert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接