如何使用Doxygen记录宏生成的类?

时间:2011-09-20 12:52:33

标签: c++ macros doxygen

我使用宏以下列方式生成类:

generator.h:

class CLASS_NAME : public parent
{
    //generate variables with names given by CLASS_VARIABLES using complicated
    //Boost.Preprocessor stuff.
};

#undef CLASS_NAME
#undef CLASS_VARIABLES

myclass.h:

#define CLASS_NAME MyClass
#define CLASS_VARIABLES (a, b, c, x, y, z)
#include "generator.h"

实际的类更复杂,并使用各种Boost.Preprocessor宏。有没有办法通过向generator.h添加注释来自动记录使用Doxygen生成的类,或者生成带文档的示例类?我尝试过启用ENABLE_PREPROCESSING和MACRO_EXPANSION,但这似乎不够。

4 个答案:

答案 0 :(得分:4)

在我写作的时候,只要有几个条件,doxygen 就会执行完整的文件包含。来自doxygen internals documentation

  

...预处理器解析,但实际上并不包含代码   遇到#include (除了#include在{within}中找到   ......}块)

我通过实验发现的另一个没有记载但却直观的前提条件是,无论{...}阻止了#include,都必须记录下来。例如,如果在FOO::A中启用{{1}配置文件,所需的提取模式设置为“所有实体”,并在FOO::B中正确设置了boost文件夹:

FOO::C

但是,删除MACRO_EXPANSION以将结构放置在匿名命名空间中将导致无文档。因此,如果您可以在显式命名空间内承担INCLUDE_PATH,那么它将起作用。

答案 1 :(得分:1)

http://www.doxygen.nl/manual/docblocks.html

中的“其他地方的文档”段落怎么样?
/*! \class CLASS_NAME
    \brief An auto generated class

    A more detailed class description.
*/

/*! \fn CLASS_NAME::CLASS_NAME()
    \brief Default constuctor
*/

答案 2 :(得分:1)

它无效。 Doxygen预处理器并不真正执行完整的文件包含(它只查看包含的文件中的宏定义;否则,ENABLE_PREPROCESSING指令将完全无用!)。所以#include "generator.h"没有效果。

如果您使用所包含文件的内容替换#include指令,它将起作用。 (我知道,这不是很有用)。

另一种方法是修改你的文件:

generator.h:

#define DEFCLASS class CLASS_NAME : public parent \
{ \
   ... whatever ... \
};

myclass.h:

#define CLASS_NAME MyClass
#define CLASS_VARIABLES (a, b, c, x, y, z)
#include "generator.h"
DEFCLASS

但如果每个源文件多次使用DEFCLASS(可能是Doxygen的错误/缺陷),这将无效。

答案 3 :(得分:1)

我建议将生成的类放在一个单独的标题中,然后记录标题。在最好的情况下,生成的类更多是实现细节。

另一种选择是脚本。使用您最喜欢的脚本语言或cheetah之类的东西都不会很糟糕。

我猜你的发电机看起来很简单,可以产生锅炉板或特性等等。

GENERATE_CLASS(Foo);
GENERATE_CLASS(Bar);

这样的东西是非常合理的grep fodder。