Date Редакция Категория comp Теги doxygen / Cpp

1. Создать файл конфигурации Doxyfile:

doxygen -g

2. Установить в Doxyfile:

# Настроить оптимизацию вывода для нужного языка
# OPTIMIZE_OUTPUT_FOR_C  = 
# OPTIMIZE_OUTPUT_JAVA   = 
# OPTIMIZE_FOR_FORTRAN   = 

EXTRACT_ALL            = YES # включает в документацию все, кроме private и static
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = YES

# Файлы для анализа (используются расширения для C++)
INPUT                  = .
INPUT_ENCODING         = UTF-8
FILE_PATTERNS          = *.c \
                         *.cpp \
                         *.h \
                         *.hpp
RECURSIVE              = YES # поиск в подкаталогах

# для Graphviz
HAVE_DOT               = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
DOT_PATH /путь/к/graphviz

3. Запустить:

doxygen Doxyfile

Пример:

// usingfun.cpp
#include <iostream>

using std::cout;
using std::endl;

int f1()
{
    cout << "I'm f1()" << endl;
    return 10;
}

int f2()
{
    cout << "I'm f2()" << endl;
    return f1();
}

int f3()
{
    cout << "I'm f3()" << endl;
    return f2();
}

int main()
{
    cout << f2() << endl;
}

Графы вызова для f1() и f2():

cg.png

Заметьте, что для обеих функций приведен граф их вызова (caller graph), а для f2() кроме того показано, как она вызывает f1(). Ниже показано как f2() вызывается из f3(), однако графа вызова самой f3() нет

cgf3.png

потому что f3() в программе не используется. Таким образом, графы вызовов можно применять для поиска функций, которые никогда не вызываются.

Рассмотрим еще один пример:

// pfun.cpp
int (*pf)(int);

int fun1(int x)
{
    if (x < 10)
        return (*pf)(x+1);
    else
        return x;
}

int fun2(int y)
{
    pf = &fun1;
    return (*pf)(y);
}

int main()
{
    pf = &fun2;
   (*pf)(5);
}

Графы вызова:

cg_pfun.png

Как видно, указатель pf в функции main становится равным fun2, а затем в функции fun2 ему присваивается значение fun1.



Комментарии

comments powered by Disqus