通过Doxygen中的宏定义的文档函数

时间:2012-05-11 10:58:21

标签: c++ documentation doxygen

我有一个实际上不存在但通过宏定义的类:

#define DEFCLASS(name,datatype) Class name { \
    public: \
        void clear(); \
        datatype obj; \
    };
DEFMETHOD(StringContainer, const char*)

...

StringContainer foo("hi!");

当然它应该是使用模板实现的,但我没有写它,我无法改变它,大型代码库依赖它。

现在的问题是,我想在doxygen中记录StringContainer。但是,它不是真正存在的类,所以如果我这样做:

/*!
    \class StringContainer
    \brief A string container

    \fn void StringContainer::clear()
    \brief Clears the container
*/

我得到了doxygen警告:

warning: documented function `StringContainer::clear' was not declared or defined.

文档不包含该功能。我知道这有点棘手,但有没有办法强制doxygen有“信念”并为StringContainer创建文档,即使它没有在源代码中定义?

可以创建假的.h文件,使doxygen相信一个类存在,同时防止构建系统包含它。这些文件可以包含 .dox 扩展名。这样,我将创建一个包含类定义和文档的.dox文件:

class StringContainer {
public:
    /*! Removes the contents of the container. */
    void clear();
    const char *obj;
};

此文件实际上不会包含在构建系统中,其唯一目的是记录StringContainer。

3 个答案:

答案 0 :(得分:4)

我必须为现有代码库做很多事情,我发现使用“EXPAND_AS_DEFINED”配置选项将为您解决此问题。 在Doxygen配置文件中,设置以下内容:

  

EXPAND_AS_DEFINED = DEFCLASS

只要包含“DEFCLASS”定义的文件是Doxygen的输入,这就可以工作。 (即,这不适用于“STDMETHOD”之类的东西,因为你可能不包含将“STDMETHOD”定义为Doxygen输入的文件)

我在VS 2010中尝试了如下,并且能够在没有警告的情况下编译和运行Doxygen。

以下是示例:

Base.h文件:

#pragma once

#define DEFCLASS(name,datatype) class name { \
    public: \
        name(){} \
        void clear(){}; \
        datatype obj; \
    };

DEFCLASS(StringContainer, const char*)


/*!
    \class StringContainer
    \brief A string container

    \fn void StringContainer::clear()
    \brief Clears the container
*/

Base.cpp文件:

#include "Base.h"

int main()
{
    StringContainer foo;
    foo.clear();


    return 0;
}

DoxygenTest.doxygen

MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = YES
EXPAND_AS_DEFINED      = DEFCLASS

答案 1 :(得分:1)

如果你在doxygen配置中将MACRO_EXPANSION设置为“是”(http://www.star.bnl.gov/public/comp/sofi/doxygen/config.htm),则doxygen将“看到”StringContainer。

答案 2 :(得分:0)

我建议阅读doxygen手册的这一部分:http://www.doxygen.org/preprocessing.html。解释如何处理DECLARE_INTERFACE和STDMETHOD宏的部分与您想要的非常相似。

因此,如果您不希望在单独的文件中编写虚拟类,这可以是一种替代解决方案。