使用库ABC时,很自然地,所有名称都包含在同一顶级namespace
中。是否可以从namespace
名称中删除顶级class
,但是显示为namespaces
?
答案 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")