C++ Doxygen:剥离顶级命名空间

C++ Doxygen:剥离顶级命名空间,c++,namespaces,doxygen,C++,Namespaces,Doxygen,使用库ABC时,所有名称都包含在同一顶级命名空间中是很自然的。是否可以从类名称中删除顶级名称空间,但显示包含的名称空间?Doxygen内部没有此类选项。仍然可以使用预处理器使其工作 #ifndef DOXY_PARSER #define LIB_NAMESPACE_STARTS namespace lib_namespace { /##/ #define LIB_NAMESPACE_ENDS } /##/ #define LIB_NAMESPACE lib_namespa

使用库ABC时,所有名称都包含在同一顶级
命名空间中是很自然的。是否可以从
名称中删除顶级
名称空间
,但显示包含的
名称空间

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\u解析器
宏。这种解决方法使库名称空间的使用变得不那么方便,但它并不是那么重要

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移动到该名称空间

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

其中,
MOCED_文件
是mocs的专用定义。如果您使用的是CMake,则可以使用以下命令指定此选项:

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