2011-09-20 17 views
7

私は次のようにクラスを生成するためのマクロを使用します。マクロ生成クラスをDoxygenで文書化するには?

generator.h:

class CLASS_NAME : public parent 
{ 
    //generate variables with names given by CLASS_VARIABLES using complicated 
    //Boost.Preprocessor stuff. 
}; 

#undef CLASS_NAME 
#undef CLASS_VARIABLES 

myclass.h:

#define CLASS_NAME MyClass 
#define CLASS_VARIABLES (a, b, c, x, y, z) 
#include "generator.h" 

実際のクラスは、より複雑であり、様々なブーストを使用しています。プリプロセッサマクロ。 generator.hにコメントを追加するか、あるいはドキュメントを使ってサンプルクラスを生成することによって、生成されたクラスをDoxygenで自動的にドキュメント化する方法はありますか? ENABLE_PREPROCESSINGとMACRO_EXPANSIONを有効にしようとしましたが、これでは十分ではありません。それは動作しませんhttp://www.stack.nl/~dimitri/doxygen/docblocks.html

/*! \class CLASS_NAME 
    \brief An auto generated class 

    A more detailed class description. 
*/ 

/*! \fn CLASS_NAME::CLASS_NAME() 
    \brief Default constuctor 
*/ 

答えて

1

でどのような "他の場所でドキュメント" についてpararaph

+0

私はクラス定義に '#include'と' #define'を再び使用するので、私はあなたの修正を使用できないと思います。私は '#define'をクラスの前に置くことができますが、私は' #include'を取り除くことはできません... – AbuBakr

+0

以下のspyderfreekで述べたように、#includeが{ }ブロックすると、インクルードが機能します。 – Heyji

1

。 Doxygenプリプロセッサは完全なファイルのインクルードを実際には実行しません(インクルードされたファイルのみでマクロ定義を調べます;そうでなければ、ENABLE_PREPROCESSINGディレクティブはまったく役に立たないでしょう)。したがって、#include "generator.h"は効果がありません。

#include指示文をインクルードされたファイルの内容で物理的に置き換えると、機能します。 (あまり役に立たない、私は知っている)。

generator.h:

#define DEFCLASS class CLASS_NAME : public parent \ 
{ \ 
    ... whatever ... \ 
}; 

がmyclass.h:

#define CLASS_NAME MyClass 
#define CLASS_VARIABLES (a, b, c, x, y, z) 
#include "generator.h" 
DEFCLASS 

しかし、あなたならば、これは動作しませんこれを行うには

もう一つの方法は、このようなあなたのファイルを変更することですソースファイルごとにDEFCLASSを2回以上使用してください(おそらくDoxygenのバグ/不具合)。

+0

ええと、これは何とか動作しません。私の実際のクラス名はCLASS_NAMEと文字列の連結であるため、提案したようにはできません。私は '\ class MyClass'を使ってみましたが、ドキュメントは生成されていないようです。 DoxygenがMyClassを検索しても見つからないのでしょうか?私は '\ class CLASS_NAMEConcatenatedString'を試しましたが、もう一度:何もしません。 – AbuBakr

1

生成されたクラスを別のヘッダーに入れてヘッダーを記録することをおすすめします。最良の場合、生成されたクラスは実装の詳細の詳細です。

もう1つのオプションは、スクリプトのものです。あなたの好きなスクリプト言語を使うか、cheetahのようなものは恐ろしいことではありません。

私はあなたのジェネレータがボイラープレートや特質など何かを簡単に作ることができると推測しています。

GENERATE_CLASS(Foo); 
GENERATE_CLASS(Bar); 

そのような何かはかなり合理的なgrepの飼料です。

+0

最初の段落を正しく理解しているかどうか分かりません。プリプロセッサ出力を含むサンプルヘッダーを作成することをお勧めしますか?このヘッダーを自動的に作成できるのであれば、これは良い解決策に過ぎません。私はcmakeを使っているので、これが可能かもしれません。私はその後、sweet.hの提案を使ってgenerator.hにコメントを作成することができました。 – AbuBakr

+0

最初の段落では、生成された出力を意味しませんでした。私はコードを独自のヘッダーに分けることを意味しました。その後、クラスの詳細ではなく、一般的な使用の概要を要約します。もう一つの選択肢は、生成されたすべてのクラスが(文字通り、または模倣して)それを "継承"し、それを文書化する純粋な仮想インターフェイスを作成することです。あなたが何かを作りたいなら、私はチーターを使うでしょう。 –

4

私が書いている時点で、Doxygen になりますが、いくつかの条件が満たされていれば、本格的なファイルが含まれます。 Doxygen internals documentationから:

...プリプロセッサを解析し、それは{ 内部見出さの#includeを除いての#include を(遭遇 ないときは、実際にはコードが含まれています...私は実験を通して発見した他の文書化されていないが、直感的な前提条件がどんなことを{...}の#include自体が文書化されなければならないであるブロックである}ブロック)

。たとえば、Boost.Preprocessorを使用している次のテストファイルでDoxygenを実行すると、コンフィグファイルでMACRO_EXPANSIONが有効で、目的の抽出モードが「すべてのエンティティ」に設定されていれば、構造体FOO::A,FOO::BおよびFOO::Cのエントリが生成され、適切INCLUDE_PATHに設定されている:

#include <boost/preprocessor/iteration/local.hpp> 
#include <boost/preprocessor/tuple/elem.hpp> 

#define STRUCTS (A, B, C) 

namespace FOO { 
    #define BOOST_PP_LOCAL_MACRO(n) struct BOOST_PP_TUPLE_ELEM(3,n, STRUCTS) {}; 
    #define BOOST_PP_LOCAL_LIMITS (0,2) 
    #include BOOST_PP_LOCAL_ITERATE() 
} 

をしかし、なしのドキュメントになります匿名の名前空間に構造体を配置するFOOを取り除きます。したがって、明示的な名前空間内で#include "generator.h"に耐えることができれば、動作します。

+0

#includeディレクティブが存在するブロックの文書化に関する2番目の前提条件についてはわかりません。私はそれが必要ではないと信じています。 – Heyji

関連する問題