2011-12-20 55 views
2

私のコードでは、vtableにいくつかの関数ポインタが含まれています。 Doxygenはそれらに従うことができません。CでのDoxygenでの関数ポインタ処理

私は今、この部分が欠けているので、完全なコールグラフを生成するために、可能なパスを認識するようにしたいと思います。

例:これはおそらくdoxygenは、コールグラフには影響を与えませんが

typedef Bool(*SPECIAL_FUNC)(KEY key); 

typedef struct{ 
    int a; 
    int b; 
    SPECIAL_FUNC; 
}OBJ; 

Bool add(KEY key); //code... 
Bool sub(KEY key); //code... 
+1

Doxygenは(単純な)静的解析を実行します。どのようにあなたのポインタが実行時に取る値を知ることができますか? –

+0

あなたは正しいです。私は、ドキュメント内で実行時にどのように動作するのか見たくない。私はintのようなものが欲しいint sub()私は正しい文書ページにジャンプすることができるように私は関数ポインタを持っているdocに表示 – Desmond

+0

しかし、どのように可能なパスがわかっていますか? –

答えて

4

、あなたが構造に関連するような機能を文書化し、SPECIAL_FUNCのドキュメントでそれらへのリンクを提供することができます。ような何か:

これにより
typedef Bool(*SPECIAL_FUNC)(KEY key); 

/** 
* struct description 
*/ 
typedef struct{ 
    int a; 
    int b; 

    /** 
    * Function pointer to one of the following: 
    * - add() 
    * - sub() 
    */ 
    SPECIAL_FUNC; 
}OBJ; 

/** 
* @relates OBJ 
* add function. 
*/ 
Bool add(KEY key); //code... 

/** 
* @relates OBJ 
* sub function. 
*/ 
Bool sub(KEY key); //code... 

は、OBJはクラスとして文書化され、addsubOBJの関連メンバーとして表示され、SPECIAL_FUNCのドキュメントはaddsubへのリンクが含まれています。

+0

それは素晴らしい、本当に私が探していたものです。お手伝いいただきありがとうございます。私は解決のために多くの時間を過ごしたが、私は私を助けることができるものは見つけられなかった。 – Desmond

2

私はこれを行うことはできないと思っていますが、これを偽造する方法の1つは、これを特別に定義し、Doxygen(PREDEFINED)を設定することだけです。

など。

#ifdef MY_DOXYGEN_FAKE 
    KEY key; 
    add(key); 
    sub(key); 
#endif 

この関数ポインタを使用する関数では、もちろん、関数から実際に使用する関数への呼び出しだけを追加する必要があるので、より多くの作業が必要です。しかし、もう一度はどのような場合でもその関数ポインタがどのように使われるべきかを知っているはずです。

+0

これは私の最初のアプローチでした。私は同じ方法でそれを定義しましたが、#ifdef #endifソリューションは、異なるファイルの多くの場所でコードを更新する必要がある場合、いくつかの問題を引き起こす可能性があります。 DRHによって投稿されたソリューションはよりクリーンです。ところで...あなたも助けてくれてありがとう – Desmond