【发布时间】:2011-07-25 04:36:41
【问题描述】:
使用库 ABC 时,所有名称都包含在同一顶级 namespace 中。是否可以从class 名称中删除顶级namespace,但显示封闭的namespaces?
【问题讨论】:
标签: c++ namespaces doxygen
使用库 ABC 时,所有名称都包含在同一顶级 namespace 中。是否可以从class 名称中删除顶级namespace,但显示封闭的namespaces?
【问题讨论】:
标签: c++ namespaces doxygen
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();
【讨论】:
之前的解决方法有个普遍的问题,使用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")
【讨论】: