Archivos fuente
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 3 de 61.
Hasta ahora, hemos colocado las declaraciones de funciones en archivos de encabezado, pero el código real de las funciones (la definición) ha estado en el archivo principal. El siguiente paso en la programación modular es trasladar esas definiciones a sus propios archivos fuente (archivos .c).
Esto crea una estructura limpia de tres partes: el archivo de encabezado declara las funciones, un archivo de código fuente independiente las define y main simplemente las usa. Así es como se ve:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Observa que math_utils.c incluye su propio archivo de encabezado. Esto garantiza que la definición de la función coincida con la declaración; si no coinciden, el compilador detectará el error. El archivo principal solo necesita incluir el archivo de encabezado para usar la función; no necesita saber cómo funciona add internamente.
Esta separación mantiene ocultos los detalles de implementación y te permite modificar la lógica de las funciones sin tocar los archivos que las utilizan.
Desafío
FácilConstruyamos una utilidad matemática sencilla organizando el código en la estructura adecuada de tres archivos: un archivo de encabezado para las declaraciones, un archivo fuente para las implementaciones y un archivo principal que los utilice.
Crearás tres archivos:
math_ops.h: tu archivo de encabezado, que contiene las declaraciones de dos funciones para realizar operaciones:multiplyysubtract. Ambas funciones reciben dos enteros y devuelven un entero. No olvides incluir las protecciones de inclusión con el símboloMATH_OPS_H.math_ops.c: tu archivo fuente, que contiene las implementaciones demultiplyysubtract. Este archivo debe incluir su propio encabezado para asegurarse de que las declaraciones coincidan con las definiciones.main.c: tu archivo principal, que incluye el encabezado y utiliza ambas funciones para realizar cálculos.
La función multiply debe devolver el producto de dos enteros, y subtract debe devolver el primer entero menos el segundo.
Recibirás dos entradas enteras: a y b.
En tu función principal, imprime los resultados de ambas operaciones en líneas separadas:
Product: {result of multiply}
Difference: {result of subtract}Por ejemplo, con las entradas 8 y 3, la salida sería:
Product: 24
Difference: 5Pruébalo tú mismo
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: Llama a la función multiply con a y b y guarda el resultado
// TODO: Llama a la función subtract con a y b y guarda el resultado
// TODO: Imprime los resultados con el siguiente formato:
// Producto: {resultado de multiply}
// Diferencia: {resultado de subtract}
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online