如何使用 Doxygen 记录依赖于预处理器定义的 typedef?

问题描述 投票:0回答:2

是否可以记录一个 typedef,根据预处理器定义具有不同类型,并使用 Doxygen 在 html 输出中显示两种替代方案?

我想要记录的代码:

/**
 * \file
 */

#ifdef _WIN32
/**
 * Documentation for Windows goes here...
 */
typedef wchar_t MyChar;
#else
/**
 * Documentation for Non-Windows goes here...
 */
typedef char MyChar;
#endif

我已经测试了几个与预处理器相关的设置,但我只能更改 html 输出中显示的 typedef 或合并文档。我什至设法让一种 typedef 显示在文件的概述部分中,而另一种则显示在详细描述中。然而我无法让两种选择同时出现。

我设法产生以下两种替代方案:

----------------------------------------------
typedef wchar_t   | MyChar   | ....
----------------------------------------------
----------------------------------------------
typedef char      | MyChar   | ....
----------------------------------------------

但不是这样的

----------------------------------------------
typedef wchar_t   | MyChar   | ....
----------------------------------------------
typedef char      | MyChar   | ....
----------------------------------------------

注意:我不介意修改源代码,只要

  • 在文档中,两种替代方案都合理地记录在 Doxygen 输出中;
    wchar_t
    char
    都需要显示在
    typedef ...
    部分
  • 编译器为文件的修改版本和当前版本生成相同的结果
  • IDE 自动完成,特别是 Visual Studio 2019 的 IntelliSense,仍然显示合理的工具提示(可选)
c doxygen
2个回答
0
投票

并不是真正的答案,只是更多的问题/建议是否可以接受以下内容:

/** \cond */
#ifdef _WIN32
#define used_type wchar_t
#else
#define used_type char
#endif
/** \endcond */
/**
 * Documentation for Windows goes here...
 *
 * Documentation for Non-Windows goes here...
 */
typedef used_type MyChar;

结果:


0
投票

我参加聚会迟到了,但是...


如果您在 ENABLE_PREPROCESSING = YES

 中设置了 
Doxyfile
,然后还设置了 
PREDEFINED = DOXYGEN
,则可以执行以下操作:

#if defined(DOXYGEN)
    /// @brief On Windows
    typedef wchar_t MyChar;

    /// @brief On other systems
    typedef char MyChar;
#else
    #if defined(_WIN32)
        typedef wchar_t MyChar;
    #else
        typedef char MyChar;
    #endif
#endif

因此编译器最终只会看到并选择一个定义,但 Doxygen 会看到这两个定义并将它们都添加到输出中。

你可以减少重复量,但代价是降低可读性:

#if defined(_WIN32) || defined(DOXYGEN)
    /// @brief On Windows
    typedef wchar_t MyChar;
#endif

#if !defined(_WIN32) || defined(DOXYGEN)
    /// @brief On other systems
    typedef char MyChar;
#endif

那个

!
比一些漂亮的大
#else
要微妙得多,但它至少意味着你不会意外地更改主代码中的定义,然后忘记更改相应的文档。

尽管如果您需要支持许多不同的操作系统,那么这很容易变成一长串过于复杂的条件。


理论上,还应该有一种方法可以使用

\typedef
命令作为显式文档的形式来实现此目的,但是当我尝试它时,我无法让它工作。


最后,设置

ENABLE_PREPROCESSING = NO
实际上可能会导致 Doxygen 读取:

#if defined(_WIN32)
    /// @brief On Windows
    typedef wchar_t MyChar;
#else
    /// @brief On other systems
    typedef char MyChar;
#endif

就好像:

/// @brief On Windows
typedef wchar_t MyChar;

/// @brief On other systems
typedef char MyChar;

但目前,这是一个未经检验的理论。


请注意,这些解决方案中的任何一个都可能最终会破坏参考链接,因为当 Doxygen 期望每个符号都是唯一的时,您实际上定义了相同的符号两次。

© www.soinside.com 2019 - 2024. All rights reserved.