如何用doxygen生成"global documentation"

How to generate "global documentation" with doxygen

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

我需要包含代码的 requirements/specification 文档。

我的问题是让这种文档(概念上不同于代码文档)接近代码实现功能(即:至少在同一个文件中,有时甚至接近特定 classes/functions/methods)但仍然能够以有序的方式收集它并将其呈现在 @mainpage 之外的 file/class 层次结构中。

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

如果能够在 class/function 完整文档(当然不是 @brief)和@mainpage.

中链接的“前言”

我需要的全局效果是有一个“规范文档”,其中我详细说明了代码的各个部分需要实现的内容,然后是“正常的 class/function/whatever”文档 doxygen id 非常好在提供。

问题(即:我不知道该怎么做)是我想在源代码中将“规范”和实现放在一起,但在文档中将它们分开,即:

  1. 一般说明:简单,这进入 @mainpage
  2. 要求:最有可能在源文件的顶部实现它们,我如何在主页中link/include?
  3. 规范:紧跟在文件顶部的要求之后或在实施它的 class/function 附近的某处;同样在这里,我不知道如何在“前言”中 link/include 又名:@mainpage.
  4. 普通代码文档:我唯一不知道的是如何在 class/function 描述中包含已用于 (2) 和 (3) 的相同“文档片段”。

这可能吗?

如果是,最佳做法是什么?

注意:我可以为每个“文档片段”使用一个单独的文件,然后 @include 将其放在正确的位置来获得效果,但这会失败整个目的是将 Requirements/Specification/code 放在一起,同时在生成的文档中将它们分成不同的部分。

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

/**
 * 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.

就是这样。

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

进一步更新:按照@albert 的回答(已接受)我成功了,但有以下注意事项:

回想起来,我认为 Doxygen \snippet['{'option'}'] <file-name> ( block_id ) 文档地址中的“注释”或多或少包含上述所有内容,但我发现它非常神秘,如果我不仔细研究它们,我将永远无法理解其中的含义.

最后一个很烦人,因为我使用了很多列表和表格,虽然 HTML 语法更强大,但在源代码中编写和阅读也更难。

找到解除此限制的方法将“非常好”。

使用以下代码和当前的 doxygen 版本 (1.9.4 (5d15657a55555e6181a7830a5c723af75e7577e2)) 以及 1.9.1 (ef9b20ac7f8a8621fcfc299f8bd0b80422390f4b) 版本,我得到了很好的结果=]:[=13

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 结构(“双换行”,在上面的例子中)是 not 已识别。