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.hcontém o protótipo deimprime_saudacao. - O arquivo
saudacao.cdefine a função. - O
main.cincluisaudacao.he 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
- Em
saudacao.h, declaramos o protótipovoid imprime_saudacao(void);para que outros arquivos saibam que a função existe. - Em
saudacao.c, incluímossaudacao.he definimos a função comprintf. - Em
main.c, incluímossaudacao.he chamamosimprime_saudacao(). - Compilamos cada
.cseparadamente:gcc -c saudacao.c -o saudacao.oegcc -c main.c -o main.o. - Ligamos os objetos:
gcc saudacao.o main.o -o programa. - Executamos
./programae 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 emmain.c. - Não incluir
saudacao.hemsaudacao.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 aimprime_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!