Desafio C

Módulo matemático com Makefile

Enunciado

Crie um módulo matematica com as funções soma, subtrai e multiplica. Cada função deve ser definida em matematica.c e declarada em matematica.h. O main lê dois inteiros, chama as três funções e imprime os resultados no formato soma: X, subtracao: Y, multiplicacao: Z. Escreva um Makefile que compile e ligue tudo.

Requisitos

  • matematica.h contém os protótipos das três funções.
  • matematica.c define as três funções.
  • main.c lê dois inteiros e imprime os resultados no formato especificado.
  • O Makefile compila matematica.c e main.c separadamente e gera o executável programa.

Código inicial

// matematica.h
#ifndef MATEMATICA_H
#define MATEMATICA_H

// prototipos

#endif

// matematica.c
#include "matematica.h"

// definicoes

// main.c
#include <stdio.h>
#include "matematica.h"

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    // chame as funcoes e imprima
    return 0;
}

# Makefile
# regras

Saída esperada

soma: 13
subtracao: 7
multiplicacao: 30
Ver dica

No Makefile, use variáveis para o compilador e flags. Crie regras para cada .o e para o executável final.

Mostrar solução
// matematica.h
#ifndef MATEMATICA_H
#define MATEMATICA_H

int soma(int a, int b);
int subtrai(int a, int b);
int multiplica(int a, int b);

#endif
// matematica.c
#include "matematica.h"

int soma(int a, int b) {
    return a + b;
}

int subtrai(int a, int b) {
    return a - b;
}

int multiplica(int a, int b) {
    return a * b;
}
// main.c
#include <stdio.h>
#include "matematica.h"

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("soma: %d\n", soma(a, b));
    printf("subtracao: %d\n", subtrai(a, b));
    printf("multiplicacao: %d\n", multiplica(a, b));
    return 0;
}
# Makefile
CC = gcc
CFLAGS = -Wall -Wextra -std=c11
OBJ = matematica.o main.o

programa: $(OBJ)
	$(CC) $(CFLAGS) -o programa $(OBJ)

matematica.o: matematica.c matematica.h
	$(CC) $(CFLAGS) -c matematica.c

main.o: main.c matematica.h
	$(CC) $(CFLAGS) -c main.c

clean:
	rm -f *.o programa

Passo a passo

  1. matematica.h declara os protótipos das três funções para que main.c possa usá-las.
  2. matematica.c inclui o cabeçalho e define cada função com a operação correspondente.
  3. main.c lê dois inteiros com scanf, chama as funções e imprime no formato pedido.
  4. O Makefile define CC e CFLAGS para compilação consistente.
  5. A regra programa depende dos objetos matematica.o e main.o e os liga.
  6. As regras matematica.o e main.o compilam cada fonte separadamente, listando o .h como dependência.
  7. A regra clean remove objetos e o executável.
  8. Executamos make e depois ./programa.

Por que funciona

A compilação separada permite compilar apenas o que mudou. O Makefile verifica timestamps: se matematica.c ou matematica.h mudar, matematica.o é recompilado. O linker junta os objetos resolvendo os símbolos das funções.

Erros comuns

  • Esquecer de listar matematica.h como dependência no Makefile: alterações no cabeçalho não disparam recompilação.
  • Não usar -c nas regras de .o: o compilador tentaria linkar e falharia.
  • Esquecer #include "matematica.h" em main.c: declarações implícitas e possível erro de linker.
  • Usar scanf sem verificar retorno: não é erro fatal, mas boa prática verificar.

Outra forma de resolver

Poderia usar gcc -c *.c e depois gcc *.o -o programa, mas o Makefile é mais eficiente e organizado.

Saída esperada

soma: 13
subtracao: 7
multiplicacao: 30