【问题标题】:Include a header file for parsing of all other files with Doxygen preprocessor包含一个头文件,用于使用 Doxygen 预处理器解析所有其他文件
【发布时间】:2013-03-10 19:08:05
【问题描述】:

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


项目背景:

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

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

config.h 根据正在构建的目标创建定义(MODEL_A 的定义列表与 MODEL_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 预处理器输出中的数字。
  • 依赖于HAS_FUNCTIONALITY_1C 文件的预处理就像未定义一样。

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


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

【问题讨论】:

  • 它是一个自动工具项目吗?如果包含config.h 通常是有条件的:#if HAVE_CONFIG_H #include #endif 所以必须设置PREDEFINED = HAVE_CONFIG_H。我为代码生成了一些文档,这些文档根据 libxml2 的可用性有条件地定义了两个函数,并且在修改 PREDEFINED 之后生成了文档。 Doxygen 1.8.8-5.
  • 您找到答案了吗?在查看网络上的各种线程后,我处于完全相同的情况并且目前正在失去希望。

标签: c c-preprocessor header-files doxygen


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    doxy_input_dir/
        |
        + src/
        |
        + inc/
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多