質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

C++/CLIをDoxygenの呼び出し関係図で出力したが出力されない関数がある

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,620

score 14

社内の既存プロジェクト(C++/CLI)について、ある関数(下記ソース:FuncA)の呼び出し関係図が必要となり、Doxygenの設定を行い、出力を行いました。

Doxygenの実行は成功し、呼び出し関係図も出力されました。
しかし出力ドキュメントのFuncAを確認してみると、コールされている関数のうち、下記ソース中のFuncBが呼び出し関係図に出力されていませんでした。

コールしているものを全て図に出力したいのですが、これによって「何故か出力されない関数がある」ということに気づきました。

FuncBのように出力されないのを回避するには、なにか設定等が必要なのでしょうか?
ご存知の方がいらっしゃいましたら、ご教授頂きたく宜しくお願い致します。

なお、FuncB()自体は、ドキュメントに出力されていました。

ソースコード抜粋

("..."はコードの中略です)
namespace XXX {
    public ref class Form1 : public System::Windows::Forms::Form
    {
        ...
        void FuncA(void)
        {
            ...
            try {
                ...
                while( ... )
                {
                    ...
                    if (...)
                    {
                        ...
                    }
                    else if( ...)
                    {
                        if(...)
                        {
                            ...

                            if(...)
                            {
                                if (...)
                                {
                                    FuncB();
                                }
                            }
                            else
                            {
                                FuncB();
                            }
                        }
                        FuncB();
                    }
                }
            }
            ...
        }
        ...
        void FuncB()
        {
            ...
        }
        ...
    };
}

Doxyfile変更箇所

EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_PACKAGE        = YES
EXTRACT_STATIC         = YES
EXTRACT_LOCAL_METHODS  = YES
HAVE_DOT               = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES

# 回答を受け変更
DOT_GRAPH_MAX_NODES    = 10000
MAX_DOT_GRAPH_DEPTH    = 1000
CPP_CLI_SUPPORT        = YES

# 別途追加で行った変更
EXTRACT_PRIV_VIRTUAL   = YES
EXTRACT_ANON_NSPACES   = YES

追記

Doxygen 最新版へ

インストールされていたDoxygenが旧Ver(1.8.14)だったため、最新版(1.8.17)にバージョンアップ。
それに伴い、「doxygen -u」でDoxyfileをバージョンアップ。

同クラス内の関数だと出力されない?

Form1が記述されているForm1.hの別の関数をチェックしてみたところ

("..."はコードの中略です)
namespace XXX {
    public ref class Form1 : public System::Windows::Forms::Form
    {
        ...
        void FuncX() {...}
        void FuncY() {
            ...
            FuncX();
            ...
        }
        ...
    };
}

のように、FuncA,FuncBと同様なケースの場合、FuncYの呼び出し関係図に、FuncXが表示されていないことがわかりました。

同クラス内の関数をコールしている場合、呼び出し関係図にその関数は記載されないのでしょうか……?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2020/01/22 18:46

    DOT_GRAPH_MAX_NODES を 10000とかに設定してみるとどうでしょう?

    キャンセル

  • lis

    2020/01/23 08:59

    ご回答ありがとうございます。早速試してみました。

    DOT_GRAPH_MAX_NODESを50(初期値)→10000とした結果、変化はありませんでした。

    下記URLの「DOT_GRAPH_MAX_NODES」説明欄に

    > (MAX_DOT_GRAPH_DEPTH でも制限)

    とあったため、MAX_DOT_GRAPH_DEPTHを0(初期値)→1000としてみましたが、コチラも変化なしでした。

    http://cercopes-z.com/Doxygen/list-config-dxy.html

    キャンセル

回答 2

check解決した方法

0

自己解決しました。

ヘッダ上(クラス定義)に直接処理が書かれている箇所が問題でした。
暫定的な対応策として、調査用の新規クラスに直書き関数のみ移植することで対処しました。

ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問の内容自体には特に問題が見当たらないので、憶測なんですが。

プリプロセッサで使用する定義は、ソースコードの中の物しか反映されません。
例えば、

  void FuncA()
  {
#ifdef HOGE
    funcB();
#endif
  }

というような場合、「#ifdef HOGE」の中はソースコードの中で定義されていなければ、解析されません。
このような場合には、「PREDEFINED」で定義してください。

PREDEFINED = HOGE

あと、C++/CLIは知らないのですが、下記のサイトを見ると「CPP_CLI_SUPPORT=YES」が要るかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/23 10:01

    ご回答ありがとうございます。
    念の為ソースを確認してみましたが、FuncB()はプリプロセッサで括られた範囲内ではありませんでした。

    とはいえDoxygenを扱うに当たっては、「有効だと思っているプリプロセッサ」には注意が必要なんですね……
    ヘッダ等で定義しているプリプロセッサは、別途注意してみます。

    「CPP_CLI_SUPPORT=YES」についても試してみましたが、結果は変わらずでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る