氧:条形顶层命名空间

Doxygen: strip top level namespace

本文关键字:命名空间      更新时间:2023-10-16

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

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

#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

您应该将此代码包含在一些公共头中,并在氧选项中设置预定义的DOXY_PARSER宏。这种解决方法使库名称空间的使用不那么方便,但它不是那么重要。

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

前面的解决方案有一个普遍的问题,当使用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是moc的独占定义。如果你正在使用CMake,你可以使用

来指定这样的选项:
QT4_WRAP_CPP(mocSources qt_file1.h qt_file2.h)
SET_SOURCE_FILES_PROPERTIES(${mocSources} PROPERTIES COMPILE_FLAGS "-DMOCED_FILE")