包含一个头文件,用于使用Doxygen预处理器解析所有其他文件

时间:2013-03-21 10:19:03

标签: c c-preprocessor header-files doxygen

我想在#define文件中包含h来解析所有其他Doxygen文件。


项目背景:

My 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_1 C 文件的预处理就好像它没有被定义一样。

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


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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我的标头与源文件位于不同的目录,例如:

doxy_input_dir/
    |
    + src/
    |
    + inc/

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

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