【问题标题】:Doxygen error: Found ';' while parsing initializer listDoxygen 错误:找到 ';'在解析初始化列表时
【发布时间】:2016-10-09 11:56:12
【问题描述】:

Doxygen 1.8.11 对以下定义感到窒息,我在不丢失警告消息的情况下尽可能地简化了它:

template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
                             std::declval<double>()))>> : std::true_type {};

警告是:

warning: Found ';' while parsing initializer list! (doxygen could be confused by a macro call without semicolon)

有趣的是,Doxygen 可以满足以下条件:

template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo())>> : std::true_type {};

这与foo 的定义基本相同。

我非常感谢一个解决方法。在最坏的情况下,我想以某种方式让 Doxygen 忽略这个定义。

【问题讨论】:

    标签: c++ c++11 doxygen


    【解决方案1】:

    我刚刚在 GitHub 中针对此问题进行了修复,请参阅 https://github.com/doxygen/doxygen/commit/985faf287233badf65fa33d21bde17afa6970d60

    【讨论】:

    【解决方案2】:

    答案在docs。使用 doxygen 的 \cond\endcond 命令或使用预处理器定义。

    /// \cond NOPE
    template <class T>
    struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
                                 std::declval<double>()))>> : std::true_type {};
    /// \endcond
    

    使用预处理器定义,您可以添加对 Doxygen 友好的定义。例如,Qt 项目就是这样做的。

    #ifdef DOXYGEN_WORKING
    template <class T>
    struct MySpecialization<T, something_that_doxygen_understands> : std::true_type {};
    #else
    template <class T>
    struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
                                 std::declval<double>()))>> : std::true_type {};
    #endif
    

    并将PREDEFINED = DOXYGEN_WORKING 添加到您的配置文件中。

    【讨论】:

    • @AlwaysLearning:这是另一种选择。给出的示例使用了\cond\endcode。访问文档;它在常见问题解答列表中,这应该是您的第一个停靠港......这个答案作者甚至将您直接链接到特定页面以提供最大的便利。
    • 但是示例定义中到底有什么让 Doxygen 感到困惑?
    • @AlwaysLearning C++ 解析起来并不简单,而且该工具早于 clang-as-a-library。您可能必须深入研究代码才能找出问题所在,但我不知道这比做其他人所做的更有帮助;)
    • 谢谢。考虑到这一点,我也接受没有先查找文档的批评。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2017-06-19
    • 2015-02-28
    • 2020-03-29
    • 2014-10-09
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多