Fácil C

Separando saudação em módulo

Enunciado

Crie um programa que imprime uma saudação. A função imprime_saudacao deve ser definida em saudacao.c e declarada em saudacao.h. O main em main.c chama essa função.

Requisitos

  • O arquivo saudacao.h contém o protótipo de imprime_saudacao.
  • O arquivo saudacao.c define a função.
  • O main.c inclui saudacao.h e chama a função.
  • A saída é exatamente Ola, mundo!.

Código inicial

// saudacao.h
#ifndef SAUDACAO_H
#define SAUDACAO_H

// declare a funcao aqui

#endif

// saudacao.c
#include <stdio.h>
#include "saudacao.h"

// defina a funcao aqui

// main.c
#include "saudacao.h"

int main(void) {
    // chame a funcao
    return 0;
}

Saída esperada

Ola, mundo!
Ver dica

No .h, use void imprime_saudacao(void);. No .c, use printf.

Mostrar solução
// saudacao.h
#ifndef SAUDACAO_H
#define SAUDACAO_H

void imprime_saudacao(void);  // protótipo

#endif
// saudacao.c
#include <stdio.h>
#include "saudacao.h"

void imprime_saudacao(void) {
    printf("Ola, mundo!\n");
}
// main.c
#include "saudacao.h"

int main(void) {
    imprime_saudacao();
    return 0;
}

Passo a passo

  1. Em saudacao.h, declaramos o protótipo void imprime_saudacao(void); para que outros arquivos saibam que a função existe.
  2. Em saudacao.c, incluímos saudacao.h e definimos a função com printf.
  3. Em main.c, incluímos saudacao.h e chamamos imprime_saudacao().
  4. Compilamos cada .c separadamente: gcc -c saudacao.c -o saudacao.o e gcc -c main.c -o main.o.
  5. Ligamos os objetos: gcc saudacao.o main.o -o programa.
  6. Executamos ./programa e vemos a saída.

Por que funciona

A compilação separada permite que main.c use a função sem conhecer sua implementação. O protótipo no .h informa ao compilador o tipo de retorno e parâmetros. O linker resolve a referência ao símbolo imprime_saudacao presente em saudacao.o.

Erros comuns

  • Esquecer o protótipo no .h: o compilador emite aviso de declaração implícita em main.c.
  • Não incluir saudacao.h em saudacao.c: a definição pode conflitar com o protótipo se houver divergência.
  • Esquecer de compilar saudacao.c: o linker reclama de referência indefinida a imprime_saudacao.

Outra forma de resolver

Poderia definir a função diretamente em main.c, mas perderia a modularidade e a compilação separada.

Saída esperada

Ola, mundo!