0

現在のプロジェクトの API を生成するために Doxygen を使用していますが、奇妙な動作に遭遇しました。基本的に、初期化リストを使用してクラスのコンストラクターでメンバー配列を設定すると、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 を実行すると、コンストラクターのドキュメントがなく、変数 v について言及されていないクラスの比較的空の HTML ファイルが得られます。バージョン 1 をコメントアウトしてバージョン 2 を使用すると、Doxygen は適切に生成されます。クラスのドキュメント。

このタイプの配列設定が C++11 の新機能であることは知っていますが、それは初期化ですか、それとも初期化リストで行われるという事実ですか? この動作の原因を誰かが知っている場合は、コード全体でこれらのタイプの初期化子を使用しているため、感謝します。必要に応じて変更を一掃することは避けたいと思います。

4

2 に答える 2

5

Doxygen v1.7.6.1 は 2011 年 12 月 10 日にさかのぼります。古いものです。

C++11 のサポートは、v1.8.2 で基本的に追加されました。あなたのケースを正確にカバーしているように見えるこのサポートのバグ ( #688647 "C++11 スタイルの均一な型を持つ初期化子リストの解析に関する問題を修正しました") は v1.8.3 で修正されました。

変更ログは、そのようなことを調査する際の友達です。

ソリューション?アップグレードして、doxygen の C++ 解析機能の更新を取得します。
最近は v1.8.5 です。

于 2013-10-18T21:54:02.950 に答える
0

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 出力では、余分な「パブリック属性」iとが表示さi_const std::list<int>ます。Doxygen はまた、 の「初期値」を見つけると信じていますi

{}

private:
  const std::list<double> d_

これは正しく機能するため、2 番目のコンストラクターに問題があることがわかりました。

// 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を再度開きます。

于 2013-12-12T10:55:35.460 に答える