【问题标题】:Doxygen inconsistently expands C macrosDoxygen 不一致地扩展 C 宏
【发布时间】:2021-09-14 06:41:12
【问题描述】:

上下文

我在用 C 编写的项目中使用 doxygen 来记录文档。 在那个项目中有很多重复的代码。 由于我仅限于使用纯 C(不允许使用 C++),因此我使用宏来减少 源文件中的重复。 在宏生成的代码中,我希望包含函数和类型声明(它们遵循一种模式,并且实际的宏相当容易编写)。 我真的希望这些生成的函数和类型出现在 doxygen 文档中,因为它们对于库 API 至关重要。但是,我正在努力使 doxygen 正确扩展宏

问题

Doxygen 并不总是扩展宏。例如。在同一行代码中,调用了两次的同一个类函数宏,第一次展开,但第二次没有展开。

我觉得解释这个问题的最好方法是展示一个MRE(你可以从here下载)

示例源文件

考虑以下文件singlefile.h

/** @file singlefile.h
@defgroup singlefile singlefile.h: Single File Example
Test file
@{
*/

#ifndef _SINGLE_FILE_H
#define _SINGLE_FILE_H

#define _CCONCAT(X, Y) X ## Y
#define _CONCAT(X, Y) _CCONCAT(X, Y)
#define CONCAT(X, Y) _CONCAT(X, Y)

#define MY_TYPE_FULL(MY_TYPE) CONCAT(My, MY_TYPE)
#define MY_TYPEDEF_H(MY_TYPE) typedef struct MY_TYPE_FULL(MY_TYPE) MY_TYPE_FULL(MY_TYPE);

MY_TYPEDEF_H(Account)

#endif

/** @} */

宏调用MY_TYPEDEF_H(Account)的预期输出是以下类型声明

typedef struct MyAccount MyAccount;

这在 C 预处理器中按预期工作(也使用 https://godbolt.org/ 验证),但在 doxygen 中没有。 doxygen 预处理器的输出是

Preprocessing /home/<username>/Documents/doxygenmacroexpand/src/singlefile.h...
Preprocessor output (size: 296 bytes):
---------
00001 /** @file singlefile.h
00002 @defgroup singlefile singlefile.h: Single File Example
00003 Test file
00004 @{
00005 */
00006 
00007 
00008 
00009 
00010 #define _CCONCAT(X, Y) 
00011 #define _CONCAT(X, Y) 
00012 #define CONCAT(X, Y) 
00013 
00014 #define MY_TYPE_FULL(MY_TYPE) 
00015 #define MY_TYPEDEF_H(MY_TYPE) 
00016 
00017 typedef struct  MyAccount  MY_TYPE_FULL( Account );
00018 
00019 
00020 
00021 /** @} */
00022 
---------
Macros accessible in this file:
---------
_CCONCAT _CONCAT MY_TYPE_FULL MY_TYPEDEF_H CONCAT 
---------

因此,HTML 文档具有以下类型声明

struct MyAccount    MY_TYPE_FULL (Account)

这会为我的实际项目生成纯垃圾文档,其中我有更多层的宏调用。

我觉得很奇怪的是同一个宏第一次被扩展,而第二次却没有。

Doxyfile

我使用了一个由 doxygen 1.8.17 生成的新 Doxyfile。我将以下标签设置为与默认不同

INPUT                  = ./src
OUTPUT_DIRECTORY       = ./doc
MACRO_EXPANSION        = YES
OPTIMIZE_OUTPUT_FOR_C  = YES

这是目录结构(tree的输出)

.
├── Doxyfile
└── src
    └── singlefile.h

问题

如何使 doxygen 正确扩展所有宏?

TL;博士。 C 源文件中的一些宏由 doxygen 预处理器扩展,而有些则没有,即使在相同的调用深度下也是如此。这会导致在最简单的情况下部分生成文档,并在我的真实项目场景中完成垃圾。

旁注:这是我在 SO 上发布的第一个问题。通常我会找到能让我解决问题的答案,但不是他的时间。无论如何,如果您对我应该如何发布问题有任何建议,我愿意提供反馈

【问题讨论】:

  • 版本 1.8.17 来自 2019 年 12 月 27 日,并出现所示问题。使用 doxygen 版本 1.8.18(2020 年 4 月 4 日),问题就消失了,因此当前版本 1.9.1 也是如此。在所有这些情况下,我确实看到了00017 typedef struct MyAccount MyAccount ;。建议更新到 1.9.1 版。 (对于完整的问题以及显示doxygen -d preprocessor 的输出的事实,OP 的一大优势)。
  • @Bodo 我发现它有点太容易回答了,但我已经回答了。

标签: c macros doxygen expansion


【解决方案1】:

版本 1.8.17 来自 2019 年 12 月 27 日,并出现所示问题。 使用 doxygen 版本 1.8.18(2020 年 4 月 4 日)时,问题就消失了,因此在当前版本 1.9.1 中也是如此。 在所有这些情况下,我确实看到了

00017 typedef struct  MyAccount   MyAccount ;

建议更新到 1.9.1 版。

【讨论】:

  • 谢谢!我可以确认这也解决了我实际项目中的问题。我在 Ubuntu 20.04 上,doxygen 1.8.17 是apt 提供的版本。通过 git 安装 doxygen 1.9.1 确实解决了这个问题。
猜你喜欢
  • 2014-02-24
  • 2021-07-17
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多