C++阵列初始化的氧气问题

Doxygen issue with C++ array initialization

本文关键字:氧气 问题 初始化 阵列 C++      更新时间:2023-10-16

我正在使用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 的新手,但它是在初始化列表中完成的还是在初始化列表中完成的事实? 如果有人知道导致这种行为的原因,我将不胜感激,因为我们在整个代码中都使用这些类型的初始值设定项,并且我希望在必要时避免彻底更改。

Doxygen v1.7.6.1 可以追溯到 2011 年 12 月 10 日。它很旧。

C++11 支持从根本上是在 v1.8.2 中添加的;此支持中的一个错误似乎完全涵盖了您的情况(#688647"修复了解析具有 C++11 样式统一类型的初始值设定项列表的问题")已在 v1.8.3 中修复。

更新日志是您研究此类事情的朋友。

解决方案是什么?升级以获取 doxygen C++解析功能的更新。
这些天我们在v1.8.5上。

我使用的是 ARCH/extra 的 Doxygen 1.8.5,当涉及到的初始值设定项列表时,问题似乎仍然存在。考虑:

// 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<int>。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。