将 Microsoft 的源代码注释语言 (SAL) 与 Doxygen 结合使用?

Cod*_*ggo 4 c++ windows winapi doxygen sal

我正在尝试使用Doxygen来记录一些使用 Microsoft源代码注释语言 (SAL)的 C++ 代码。但是,Doxygen 无法正确解析某些注释宏,例如_Success_、 。在示例函数注释的情况下,_Success_Doxygen 将此宏误解为函数头/原型。

以包含函数注释标记的以下示例为例:

/**
 *    @file
 *    Example with function annotation.
 */

#include <windows.h>
#include <sal.h>

/**
 *    @brief This is a function.
 *    @param i a random variable
 *    @return TRUE on every call.
 */
_Success_(return) // The SAL function annotation.
BOOL function(_In_ int i) {
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

对于上面的示例,Doxygen 将解释_Success_()为函数头/原型,从而创建绝对错误的文档。以下是带有不带有函数注释的HTML Doxygen 输出:

有和没有函数注释的比较

通过函数注释,Doxygen 还表示我已经记录了一个i不属于参数列表的参数变量:

C:/.../Source.cpp:9: 警告:在成功的参数列表中找不到命令 @param 的参数“i” (返回)

我是否缺少主Doxygen 配置文件中的配置设置?
或者SALDoxygen根本不兼容

Cod*_*ggo 7

啊哈!经过进一步研究,我在 Stack Overflow 上发现了一个问题,它提出了同样的问题,只是它没有正确标记,并且没有明确说明她/他正在使用“Microsoft 的 SAL”。这就是为什么我花了一段时间才找到它。(我已经更新了相应的问题来纠正这些错误。)

问题的答案引用了 Doxygen 手册中标题为:Preprocessing 的部分。

需要预处理器帮助的一个典型示例是在处理 Microsoft 的语言扩展时:__declspec. GNU 的扩展也是如此__attribute__。[...] 当什么都不做时,doxygen 会感到困惑并被视为__declspec某种功能。[...]

因此,对于我上面的示例,需要在Doxygen 配置文件中配置的设置如下:

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = YES
PREDEFINED             = _Success_(x)= \
                         _In_=
Run Code Online (Sandbox Code Playgroud)

基本上,这组配置意味着该部分中定义的宏将在“预处理器启动之前PREDEFINED”被完全扩展和评估。但是,当我们为等式的定义侧提供“无”时,这些宏将扩展为“无”(即格式:)。因此,在 Doxygen 构建文档文档时,它们基本上被忽略/删除。name=definition

不幸的是,这确实意味着需要继续扩展此PREDEFINED列表以至少封装源代码中使用的所有 SAL 宏。更好的解决方案是将所有 SAL 宏封装在此列表中,但未来的验证是不可能的,因为在附加稍后添加的任何新宏时总是会迟到。但至少,有一个解决方案!