Doxygen 不一致地扩展 C 宏

如何解决Doxygen 不一致地扩展 C 宏

背景

我在一个用 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 版。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?