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