Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Documentación con Doxygen

Generación de documentación automática para C, C++ y Java en la cátedra

Universidad Nacional de Rio Negro - Sede Andina

La documentación es una parte fundamental de la ingeniería de software. En el ámbito académico, documentar el código no solo facilita la legibilidad, sino que también promueve el rigor conceptual al obligar a formalizar las precondiciones, postcondiciones e invariantes del diseño de software.

En la cátedra se utiliza Doxygen para compilar la documentación técnica de las interfaces públicas directamente desde los comentarios del código fuente. Esta guía detalla la configuración y las buenas prácticas para estructurar el código de tus entregas.


1. Instalación de Doxygen y dependencias

Para generar la documentación localmente, debés contar con el motor de Doxygen y opcionalmente con Graphviz para renderizar los diagramas de dependencias y llamadas (árboles de ejecución).

# En distribuciones basadas en Debian/Ubuntu (como Ubuntu WSL)
sudo apt-get update
sudo apt-get install -y doxygen graphviz

# En Arch Linux
sudo pacman -S doxygen graphviz

# En macOS (utilizando Homebrew)
brew install doxygen graphviz

2. Configuración mediante el Doxyfile

El archivo de configuración principal de Doxygen se llama Doxyfile. Este archivo contiene directivas clave que le indican al motor qué archivos procesar, qué formatos generar (HTML, LaTeX, etc.) y cómo estructurar la salida.

Creación del archivo de configuración inicial

Para generar un archivo con las opciones por defecto en la raíz de tu proyecto, ejecutá:

doxygen -g Doxyfile

Configuración recomendada para la cátedra

Debés modificar el Doxyfile generado para ajustarlo a las directrices de la cátedra. A continuación se detallan las opciones principales:

ParámetroValor recomendadoPropósito
PROJECT_NAME"Tu Proyecto"Nombre que se mostrará en el encabezado de las páginas HTML.
OUTPUT_DIRECTORYdocsCarpeta de salida para todos los archivos generados.
GENERATE_HTMLYESGenera documentación en formato web interactivo.
GENERATE_LATEXNODesactiva LaTeX, salvo que la entrega lo solicite explícitamente.
INPUTsrc includeLista de directorios que contienen código fuente y cabeceras.
FILE_PATTERNS*.c *.h *.javaExtensiones de archivo que Doxygen debe analizar.
RECURSIVEYESIndica que debe buscar recursivamente dentro de subdirectorios.
EXTRACT_ALLYESAsegura que se procesen incluso las funciones sin documentación explícita.
GENERATE_TREEVIEWYESAñade un panel de navegación lateral en la documentación web.
HAVE_DOTYESActiva la generación de gráficos de herencia y dependencias (requiere Graphviz).
CALL_GRAPHYESGenera diagramas detallados de los flujos de llamadas de funciones.
CALLER_GRAPHYESGenera diagramas que muestran quién invoca a cada función.

Para asegurar la uniformidad en las entregas, podés anexar el siguiente bloque institucional de configuración al final de tu Doxyfile:

# --- Configuración institucional UNRN ---
OUTPUT_LANGUAGE = Spanish
OPTIMIZE_OUTPUT_FOR_C = YES
GENERATE_TREEVIEW = YES
FULL_PATH_NAMES = NO
STRIP_FROM_PATH = include/ src/
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = YES
WARN_IF_UNDOCUMENTED = YES
USE_MDFILE_AS_MAINPAGE = README.md

3. Comentarios del código con notación @

En la cátedra se prefiere el uso de la notación @ en lugar del símbolo \ para definir los tags de Doxygen. Los bloques de documentación deben empezar siempre con la firma /** (en C/Java) o ///.

Tags esenciales para funciones y métodos

TagArgumentoPropósito
@briefDescripción resumidaExplicación en una línea de la función o módulo.
@paramnombre descripciónDocumenta el propósito de un parámetro de entrada.
@returndescripciónDetalla el valor de retorno y sus condiciones (ej: NULL si falla).
@notetexto aclaratorioInformación adicional importante para el usuario de la API.
@warningadvertenciaRestricciones críticas de uso o potenciales comportamientos indefinidos.
@seereferenciaEnlace a otras funciones o tipos relacionados.
@throws / @exceptionTipoException descripción(Solo Java/C++) Documenta excepciones lanzadas.

4. Ejemplos de uso práctico

Ejemplo 1: Archivo de cabecera en C (punto.h)

En C, la documentación de la API pública debe realizarse en el archivo de cabecera .h y no en la implementación .c. Esto permite que el usuario del módulo comprenda la interfaz sin necesidad de inspeccionar el código de bajo nivel.

/**
 * @file punto.h
 * @brief Definición del Tipo de Dato Abstracto (TDA) Punto.
 * @author Cátedra de Programación I
 * @date 2026
 */

#ifndef PUNTO_H
#define PUNTO_H

/**
 * @struct punto_t
 * @brief Representa una coordenada bidimensional en un plano cartesiano.
 */
typedef struct {
    double x; /**< Coordenada en el eje de las abscisas (horizontal). */
    double y; /**< Coordenada en el eje de las ordenadas (vertical). */
} punto_t;

/**
 * @brief Crea un nuevo punto a partir de sus coordenadas cartesianas.
 * 
 * @param x Coordenada en el eje horizontal.
 * @param y Coordenada en el eje vertical.
 * @return punto_t El punto inicializado.
 * 
 * @note Este método no realiza asignaciones de memoria dinámica en la pila
 *       de llamadas principal del sistema.
 */
punto_t punto_crear(double x, double y);

/**
 * @brief Calcula la distancia euclidiana entre dos puntos.
 * 
 * La fórmula implementada es:
 * \f[
 * d = \sqrt{(p_1.x - p_2.x)^2 + (p_1.y - p_2.y)^2}
 * \f]
 * 
 * @param p1 Primer punto de referencia.
 * @param p2 Segundo punto de referencia.
 * @return double La distancia entre ambos puntos expresada en unidades lineales.
 * @warning Si se pasan puntos con coordenadas no inicializadas, el comportamiento
 *          es indefinido.
 */
double punto_distancia(punto_t p1, punto_t p2);

#endif // PUNTO_H

Ejemplo 2: Clase estructurada en Java (Pila.java)

En Java, se documentan tanto las clases como sus campos e interfaces públicas mediante comentarios de Javadoc estructurados compatibles con Doxygen.

package ar.edu.unrn.p1.tad;

import java.util.EmptyStackException;

/**
 * Representa una estructura de datos lineal de tipo LIFO (Last In, First Out).
 * Esta implementación no admite elementos nulos.
 *
 * @author Cátedra de Programación I
 * @version 1.1
 * @param <T> Tipo genérico de los elementos almacenados en la pila.
 */
public class Pila<T> {

    private java.util.List<T> elementos;

    /**
     * Constructor por defecto. Inicializa la pila vacía sin elementos preasignados.
     */
    public Pila() {
        this.elementos = new java.util.ArrayList<>();
    }

    /**
     * Inserta un nuevo elemento en el tope de la pila.
     *
     * @param elemento Objeto a apilar.
     * @throws IllegalArgumentException si el elemento provisto es nulo.
     */
    public void apilar(T elemento) {
        if (elemento == null) {
            throw new IllegalArgumentException("No se pueden apilar valores nulos");
        }
        this.elementos.add(elemento);
    }

    /**
     * Desapila y retorna el elemento ubicado en el tope de la pila.
     *
     * @return El elemento desapilado.
     * @throws EmptyStackException si se intenta desapilar de una pila que no contiene elementos.
     */
    public T desapilar() {
        if (this.estaVacia()) {
            throw new EmptyStackException();
        }
        return this.elementos.remove(this.elementos.size() - 1);
    }

    /**
     * Verifica el estado de ocupación de la pila.
     *
     * @return true si la pila no posee elementos, false en caso contrario.
     */
    public boolean estaVacia() {
        return this.elementos.isEmpty();
    }
}

5. Compilación local de la documentación

Una vez configurado el Doxyfile y documentados los archivos del proyecto, se puede compilar la documentación localmente utilizando la terminal.

  1. Ubicarse en el directorio raíz de la entrega (donde reside el Doxyfile).

  2. Ejecutar el comando de compilación:

doxygen Doxyfile

Este proceso analizará el código fuente y creará la carpeta docs/ con las subcarpetas html/ (y latex/ si estuviese habilitada). Para visualizar la página principal interactiva, se debe abrir en el navegador web el archivo:

docs/html/index.html

Captura de pantalla de la interfaz web generada por Doxygen. Se observa el panel lateral izquierdo con el árbol jerárquico de archivos y miembros, y el panel principal detallando la documentación de la estructura punto_t y la función punto_distancia con su respectivo diagrama de flujo de llamadas de Graphviz.

Previsualización de la documentación HTML generada y su estructura de navegación.


6. Automatización y despliegue (GitHub Actions)

Es altamente recomendable configurar un proceso de integración continua (CI) para compilar y publicar la documentación automáticamente en GitHub Pages tras cada cambio en el repositorio.

Creá el archivo .github/workflows/doxygen.yml con el siguiente contenido:

name: Compilación automática de documentación

on:
  push:
    branches:
      - main
    paths:
      - '**.c'
      - '**.cpp'
      - '**.h'
      - '**.hpp'
      - '**.java'
      - 'Doxyfile'
      - 'README.md'

permissions:
  contents: write

jobs:
  build-docs:
    runs-on: ubuntu-latest

    steps:
      - name: Clonar el repositorio
        uses: actions/checkout@v4

      - name: Instalar Doxygen y Graphviz
        run: |
          sudo apt-get update
          sudo apt-get install -y doxygen graphviz

      - name: Generar documentación técnica
        run: doxygen Doxyfile

      - name: Desplegar en GitHub Pages
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: docs/html

7. Diagnóstico y resolución de advertencias comunes

Doxygen emitirá advertencias en la terminal si encuentra incoherencias. Mantener la compilación libre de warnings es un requisito para la entrega de proyectos: