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():

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

потому что 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);
}
Графы вызова:

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