6

我想包含文件中的#definesh以使用 Doxygen 解析所有其他文件。


项目背景:

我的 C 项目包含一个头文件config.h,它是构建命令。

它还MODEL_A在同一构建命令上定义了一个目标。

config.h根据正在构建的目标创建定义(与 for 的定义列表不同MODEL_AMODEL_B

#if defined(MODEL_A)
#define HAS_FUNCTIONALITY_1
#define HAS_FUNCTIONALITY_2
#elif defined(MODEL_B)
#define HAS_FUNCTIONALITY_3
#define HAS_FUNCTIONALITY_4
#endif 

我对 Doxygen 的问题:

我尝试使用 Doxygen 生成文档。我在 Doxyfile 中有:

# including of config.h to INPUT seems necessary.
INPUT = ./source/config.h \
    ./source
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = NO
INCLUDE_PATH = ./source
INCLUDE_FILE_PATTERNS = ./source/config.h
PREDEFINED = MODEL_A

依赖于定义的代码HAS_FUNCTIONALITY_x不包含在文档中,就好像预处理器没有在config.h.


到目前为止我的发现:

我在 的帮助下检查了预处理器输出doxygen -d Preprocessor,可以看到:

  • ./source/config.h首先被解析,并且根据MODEL_A(我可以#defines在预处理器输出中看到正确的)正确解析。#define HAS_FUNCTIONALITY_1预处理器输出中的数字。
  • 依赖于行为的C文件的预处理HAS_FUNCTIONALITY_1就好像它没有被定义一样。

在DoxyfileHAS_FUNCTIONALITY_1的字段中定义按预期工作。PREDEFINED这不是一个实用的解决方案,但仍然很有趣。


当预处理器在所有后续C文件上工作时,如何确保#define首先预处理的行保持定义?config.h

4

2 回答 2

0

显示 C 代码本身可能对您有益。一般来说,Doxygen 运行一个标准的预处理器——即渲染的代码应该与编译器预处理它的代码相同。为了#define HAS_FUNCTIONALITY_1在代码中实现等效 - 它必须被定义。我从您不愿将其添加到 doxygen 配置中了解到,它是在项目的其他位置(或者可能是 Makefile)中定义的,这就是实际代码的行为就像它已定义的原因。如果是这种情况,除了更多的预处理器技巧或简单地将其添加到 doxygen 配置文件中之外,我看不到一个合理的解决方法。

于 2013-06-08T08:39:43.890 回答
0

我遇到了一个非常相似的问题。

我的标题与我的源位于不同的目录中,例如:

doxy_input_dir/
    |
    + src/
    |
    + inc/

我将RECURSIVE输入文件选项设置为YES。我假设预处理器会正确找到我的标题。但是,当我通过运行查看预处理器输出时,doxygen -d Predefined <doxyfile>我看到了很多#include foo.h: not found! skipping....

INCLUDE_PATH解决方案是使用标记显式指定所有头目录。

于 2018-10-25T20:28:52.340 回答