我想在#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
行保持定义?
答案 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
标签显式指定所有标头目录。