【问题标题】:Doxygen copydoc tag to reuse code examplesDoxygen copydoc 标签重用代码示例
【发布时间】:2011-06-27 12:47:06
【问题描述】:

我想使用 \copydoc 标签重用一段示例代码。

解释问题。假设我有两个记录在案的函数:

/** Aquires resource. */
Resource* AquireResource( int id );

/** Releases resource.*/
void ReleaseResource( Resource* res );

在许多情况下,我想放入一个小代码示例,说明如何在上下文中使用该函数,这通常涉及使用一系列函数,这些函数都可能被同一个代码示例充分描述,例如:

/** Aquires resource.
 *
 * \par Example:
 * \code
 * Resource* res = AquireResource( 42 );
 * ReleaseResource( res );
 * \endcode
 */
Resource* AquireResource( int id );

/** Releases resource.
 *
 * \par Example:
 * \code
 * Resource* res = AquireResource( 42 );
 * ReleaseResource( res );
 * \endcode
 */
void ReleaseResource( Resource* res );

所以代码示例是重复的,不好。我想使用copydoc,像这样:

/** \page ResourceExampleTag
 * \code
 * Resource* res = AquireResource( 42 );
 * ReleaseResource( res );
 * \endcode
 */    

/** Aquires resource.
 *
 * \par Example:
 * \copydoc ResourceExampleTag
 */
Resource* AquireResource( int id );

/** Releases resource.
 *
 * \par Example:
 * \copydoc ResourceExampleTag
 */
void ReleaseResource( Resource* res );

即一个地方的代码示例,在其他地方重用。

这实际上是我所得到的,但我对此并不满意,因为我不知道如何隐藏我要从中复制的虚拟页面“ResourceExampleTag”。因此,在生成的文档中的某处有一个页面,其中一些代码完全脱离了上下文。据我所知,这里的事情是找到一个可以被 copydoc 引用并且不会在其自身上呈现任何内容的标签。不过,这只是我的想法,可能还有更好的想法。

我还可以提到我(出于几个原因,我不会费心介绍)不希望将 \example 标记与外部示例代码文件一起使用。

谢谢。

【问题讨论】:

    标签: doxygen reusability


    【解决方案1】:

    这对我有用:

    class MyClass
    {
      public:
        /**
         * @class hide_commonstuff
         * @par Example:
         * @code
         * The common example
         * @endcode
         */
    
        /**
         * First function.
         *
         * @copydoc hide_commonstuff
         */
        void first();
    
        /**
         * Second function.
         *
         * @copydoc hide_commonstuff
         */
        void second();
    };
    

    然后在你设置的 doxygen 配置中EXCLUDE_SYMBOLS = hide_*

    该文档是从hide_commonstuff 复制的,但该类未显示在类列表中。

    另外:@copydoc 之前必须有一个空行,否则它不起作用(有时,并非总是...)

    【讨论】:

    • 哇,谢谢你提示copydoc标签上方的空白行让它工作!
    • 这很好用,但可能有一些其他标签可用于方法模板而不是@class?将@class 用于方法似乎在语义上有点可疑。我已经尝试了明显的@fn,但没有成功。
    【解决方案2】:

    我发现@sn-p 命令对于像您尝试那样创建内联示例更有用。基本上我有一个示例源文件,my_examples.cpp

    /// [exampleMyFirst]
    void foo(void)
    {
        Resource* foo = AquireResource(42);
        ReleaseResource(foo);
        foo = nullptr; //Or NULL
    }
    /// [exampleMyFirst]
    
    /// [exampleTwo]
    void bar(void)
    {
        std::cout << "Unrelated to my first example." << std::endl;
    }
    /// [exampleTwo]
    

    然后在函数的 doxygen 文档块中使用 @sn-p 来使用示例。

    /// Aquires resource.
    ///
    /// @par Example:
    /// @snippet my_examples.cpp exampleMyFirst
    Resource* AquireResource( int id );
    

    ...当然,只有在完成答案之后,我才意识到您不想使用外部文件,但是由于我偶然发现了这个问题,试图做我在这里描述的事情,它可能对某人有用!

    【讨论】:

    • 实际上,能够为所有示例使用单个外部文件并通过标签巧妙地选择它们可能是迄今为止我见过的最干净的。干杯。
    【解决方案3】:

    我遇到了同样的问题,也找不到任何优雅的解决方案。我最终想出了以下几点:

    1) 在某个随机页面上,链接到一个名为 Hidden 的新子页面

    /*! \mainpage My MainPage
       blah blah blah
       \subpage Hidden
       */
    

    2) 创建隐藏页面,链接到您的“虚拟”示例主题。将页面命名为&amp;nbsp;

    /*! \page Hidden &nbsp;
        \subpage MyExample
       */
    

    3) 现在你可以在任何你喜欢的地方\copydoc MyExample,它对doxygen生成的HTML的用户是不可见的。

    【讨论】:

    • 抱歉,没有让这个工作。在生成的 HTML 中,索引清楚地显示了(相当混乱的)页面层次结构“mainpage”->“ ”->“MyExample”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2017-09-25
    • 2012-07-28
    • 2011-06-02
    • 2012-05-11
    • 2012-01-19
    相关资源
    最近更新 更多