Doxygen:剥离顶级命名空间

时间:2011-07-25 04:36:41

标签: c++ namespaces doxygen

使用库ABC时,很自然地,所有名称都包含在同一顶级namespace中。是否可以从namespace名称中删除顶级class,但是显示为namespaces

2 个答案:

答案 0 :(得分:3)

Doxygen内部没有这样的选项。您仍然可以使用预处理器使其工作。

#ifndef DOXY_PARSER
    #define LIB_NAMESPACE_STARTS namespace lib_namespace { /##/
    #define LIB_NAMESPACE_ENDS } /##/
    #define LIB_NAMESPACE lib_namespace
#else
    #define LIB_NAMESPACE_STARTS /##/
    #define LIB_NAMESPACE_ENDS /##/
    #define LIB_NAMESPACE
#endif

您应该将此代码包含在一些常见标头中,并在Doxygen选项中设置预定义的DOXY_PARSER宏。这种解决方法使得使用库命名空间不太方便,但它并不那么重要。

LIB_NAMESPACE_STARTS();
    namespace internal_namespace {
        struct Trololo {};
    }
    LIB_NAMESPACE::internal_namespace::Trololo T;
LIB_NAMESPACE_ENDS();

答案 1 :(得分:1)

以前的解决方案存在一般问题,使用Qt时无效。 moc'ing进程不使用预处理器,并且未使用命名空间(导致编译时错误)。

一种可能的解决方案是使用#define QT_NAMESPACE lib_namespace,但它会将整个Qt移动到该命名空间。

下一个解决方案更为通用(为方便起见,我保留了宏名称):

#ifndef DOXY_PARSER
    #define LIB_NAMESPACE lib_namespace
    #define LIB_NAMESPACE_STARTS namespace LIB_NAMESPACE { /##/
    #if (defined MOCED_FILE)
        #define LIB_NAMESPACE_ENDS } using namespace LIB_NAMESPACE; /##/
    #else
        #define LIB_NAMESPACE_ENDS } /##/
    #endif
    #define USING_LIB_NAMESPACE using namespace LIB_NAMESPACE; /##/
#else
    #define LIB_NAMESPACE_STARTS /##/
    #define LIB_NAMESPACE_ENDS /##/
    #define LIB_NAMESPACE
    #define USING_LIB_NAMESPACE /##/
#endif

其中MOCED_FILE是mocs独有的定义。如果您使用的是CMake,则可以使用以下命令指定此选项:

QT4_WRAP_CPP(mocSources qt_file1.h qt_file2.h)
SET_SOURCE_FILES_PROPERTIES(${mocSources} PROPERTIES COMPILE_FLAGS "-DMOCED_FILE")