我有一个项目,其中有大量的条件定义,可以使跨平台开发变得更容易。然而,我在说服 Doxygen 提取所有定义时遇到了问题,因为它只会提取那些恰好评估的定义。
例如,在以下代码片段中,Doxygen 将记录
TARGET_X86_64
但不记录 TARGET_ARM64
。
#if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)
/** Build target is ARM64 if defined. */
#define TARGET_ARM64
#else
/** Build target is x86_64 if defined. */
#define TARGET_X86_64
#endif
启用 EXTRACT_ALL 没有帮助,禁用预处理会导致 Doxygen 根本不记录任何内容。如何让 doxygen 提取这两种情况的文档?
我制定了一个冗长但有效的“解决方案”。当您想要使用
#elseif
语句时,这比仅使用纯 #if
语句要容易得多。虽然两者都可以。
首先,定义一切,不要关心条件逻辑。
/** Some define */
#define TARGET_DEFINE
/** Some other define */
#define OTHER_TARGET_DEFINE
其次,采用最初用于创建定义的条件逻辑并将其转换为取消定义逻辑。
#if !(ORIGINAL_LOGIC)
#undef TARGET_DEFINE
#endif
最后,更改条件逻辑,以便 doxygen 进行预处理时没有未定义的内容。
#if !defined(DOXYGEN)
...
我喜欢马克·阿尔夫的想法补充:
PREDEFINED = IN_DOXYGEN
在doxygen配置文件中。那么你可以简单地使用条件逻辑并且没有冗余数据:
#if defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__) || defined(IN_DOXYGEN)
/*! \brief Build target is ARM64 if defined. */
#define TARGET_ARM64
#endif
#if !(defined(_M_ARM64) || defined(__arm64__) || defined(__aarch64__)) || defined(IN_DOXYGEN)
/*! \brief Build target is x86_64 if defined. */
#define TARGET_X86_64
#endif