2013-10-18 77 views
0

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

这里有一个简单的测试类:

#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来说是新的,但它是在初始化列表中完成的初始化还是事实?如果有人知道是什么导致了这种行为,我会很感激,因为我们在代码中使用了这些类型的初始值设定项,并且我希望在必要时避免进行彻底的更改。

+1

您使用的是哪种版本的氧气? –

+0

@DavidHammen我使用apt-get中的doxygen 1.7.6.1 – kelano

回答

4

Doxygen v1.7.6.1的历史可以追溯到2011年12月10日。这是旧的。

C++ 11支持基本上是在v1.8.2中添加的;这个支持中的一个错误似乎精确地覆盖了你的案例(#688647“解决了使用C++ 11风格统一类型解析初始化器列表的问题”)在v1.8.3中得到修复。

The changelog是你研究这类事情的朋友。

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

0

我使用Doxygen 1.8.5从ARCH/extra,并且问题似乎仍然存在,当涉及到空的初始化程序列表。考虑:

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