Doxygen:剥离顶级命名空间

发布于 2024-11-26 05:47:51 字数 139 浏览 1 评论 0原文

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

When working with library ABC, it natural that all names are included into the same top level namespace. Is it possible to remove top level namespace from class names, but show inclosed namespaces?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不念旧人 2024-12-03 05:47:51

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();

There is no such option inside of Doxygen. Still you can use preprocessor to make it work.

#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

You should include this code into some common header and set predefined DOXY_PARSER macro in Doxygen options. This workaround makes using of library namespace less convenient but it is not so crucial.

LIB_NAMESPACE_STARTS();
    namespace internal_namespace {
        struct Trololo {};
    }
    LIB_NAMESPACE::internal_namespace::Trololo T;
LIB_NAMESPACE_ENDS();
与往事干杯 2024-12-03 05:47:51

之前的解决方案有一个普遍的问题,在使用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")

There is a general problem with the previous solution, it is not valid when using Qt. The moc'ing process doesn't use the preprocessor and the namespace is not used (leading to a compile time error).

One possible solution would be to use a #define QT_NAMESPACE lib_namespace but it will move the whole Qt to that namespace.

The next solution is more general (I've kept the macros name for convenience):

#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

Where MOCED_FILE is a define exclusive for mocs. If you are using CMake, you can specify such option using:

QT4_WRAP_CPP(mocSources qt_file1.h qt_file2.h)
SET_SOURCE_FILES_PROPERTIES(${mocSources} PROPERTIES COMPILE_FLAGS "-DMOCED_FILE")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文