【问题标题】:Doxygen issue with C++ array initializationC++ 数组初始化的 Doxygen 问题
【发布时间】:2013-10-18 18:26:54
【问题描述】:

我正在使用 Doxygen 为我当前的项目生成一个 API,并且发生了一些奇怪的行为。基本上,如果我使用初始化列表在类的构造函数中设置成员数组,Doxygen 不会产生正确的输出。

这是一个简单的测试类:

#ifndef TEST_HPP
#define TEST_HPP

class TestClass {
public:
    /** Constructor Version 1 */
    TestClass() : v{0,0,0} { }

    /** Constructor Version 2 */
    // TestClass() { 
    //     v[0] = 0;
    //     v[1] = 0;
    //     v[2] = 0;
    // }
protected:
    /** my little array */
    float[3] v;
};

#endif // TEST_HPP

如果我在构造函数版本 1 的文件上运行 doxygen,我会得到一个相对空的 HTML 文件,该类没有构造函数文档,也没有提及我的变量 v。如果我注释掉版本 1 并使用版本 2, Doxygen 为该类正确生成文档。

我知道这种类型的数组设置对 C++11 来说是新的,但它是初始化还是它在初始化列表中完成的事实?如果有人知道导致这种行为的原因,我将不胜感激,因为我们在整个代码中都使用了这些类型的初始化程序,并且我希望在必要时避免进行彻底的更改。

【问题讨论】:

  • 你用的是哪个版本的氧气?
  • @DavidHammen 我正在使用来自 apt-get 的 doxygen 1.7.6.1

标签: c++ doxygen initialization-list


【解决方案1】:

Doxygen v1.7.6.1 可以追溯到 2011 年 12 月 10 日。它已经过时了。

v1.8.2 从根本上增加了对 C++11 的支持;此支持中的一个错误似乎恰好涵盖了您的情况(#688647“Fixed problem parsing initializer list with C++11 style uniform types”)已在 v1.8.3 中修复。

The changelog 是你研究这些东西的朋友。

解决方案?升级以获取 doxygen 的 C++ 解析能力的更新。
这些天我们使用的是 v1.8.5。

【讨论】:

    【解决方案2】:

    我正在使用来自 ARCH/extra 的 Doxygen 1.8.5,当涉及到 empty 初始化列表时,问题似乎仍然存在。考虑:

    // not parsed correctly by doxygen 1.8.5
    class X
    {
    public:
      typedef std::initializer_list<double> DoublesInitializer;
      typedef std::initializer_list<int   >    IntsInitializer;
    
      X(DoublesInitializer d, IntsInitializer i={}) : d_(d), i_(i) {}
      X(IntsInitializer i) : X({},i) {}
    
    private:
      const std::list<double> d_;
      const std::list<int   > i_;
    };
    

    这是有效的 C++11 代码,但在 Doxygen html 输出中出现了多余的“公共属性”ii_,第一个没有类型,第二个有类型 const std::list&lt;int&gt;。 Doxygen 还认为可以为i 找到“初始值”,即

    {}
    
    private:
      const std::list<double> d_
    

    事实证明,第二个构造函数是有问题的,因为它可以正常工作:

    // parsed correctly by doxygen 1.8.5
    class Y
    {
    public:
      typedef std::initializer_list<double> DoublesInitializer;
      typedef std::initializer_list<int   >    IntsInitializer;
    
      Y(DoublesInitializer d, IntsInitializer i={}) : d_(d), i_(i) {}
      Y(IntsInitializer i) : Y(DoublesInitializer(),i) {}
    
    private:
      const std::list<double> d_;
      const std::list<int   > i_;
    };
    

    如果这确实是一个错误,我会重新打开#688647

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多