Médio C
Contador global com extern
Enunciado
Crie um contador global int contador definido em contador.c e declarado como extern em contador.h. A função incrementa() aumenta o contador e o retorna. O main chama incrementa() três vezes e imprime o valor final.
Requisitos
- A variável
contadoré definida emcontador.ce declaradaexternemcontador.h. - A função
incrementaretorna o novo valor do contador. - O
mainchamaincrementatrês vezes e imprime o resultado. - A saída é exatamente
3.
Código inicial
// contador.h
#ifndef CONTADOR_H
#define CONTADOR_H
// declare extern a variavel e o prototipo
#endif
// contador.c
#include "contador.h"
// defina a variavel e a funcao
// main.c
#include <stdio.h>
#include "contador.h"
int main(void) {
// chame incrementa 3 vezes e imprima
return 0;
}
Saída esperada
3
Ver dica
No .h, use extern int contador; e int incrementa(void);. No .c, defina int contador = 0; e a função.
Mostrar solução
// contador.h
#ifndef CONTADOR_H
#define CONTADOR_H
extern int contador; // declaração externa
int incrementa(void); // protótipo
#endif
// contador.c
#include "contador.h"
int contador = 0; // definição da variável global
int incrementa(void) {
contador++;
return contador;
}
// main.c
#include <stdio.h>
#include "contador.h"
int main(void) {
incrementa();
incrementa();
incrementa();
printf("%d\n", contador);
return 0;
}
Passo a passo
contador.hcontémextern int contador;para informar que a variável existe em outro arquivo.contador.cinclui o cabeçalho e defineint contador = 0;(a definição real).- A função
incrementamodificacontadore retorna o novo valor. main.cincluicontador.he chamaincrementa()três vezes.- Imprimimos
contadordiretamente, poisexterno torna visível. - Compilamos e ligamos os objetos:
gcc -c contador.c -o contador.o,gcc -c main.c -o main.o,gcc contador.o main.o -o programa.
Por que funciona
extern diz ao compilador que contador será definido em outro módulo. O linker encontra a definição em contador.o e resolve a referência. Assim, múltiplos arquivos compartilham a mesma variável global.
Erros comuns
- Definir
int contador = 0;no.hem vez deextern: se o.hfor incluído por vários.c, haverá múltiplas definições e erro de linker. - Esquecer
externno.h: cada arquivo que incluir o.htentará definir a variável, causando conflito. - Não inicializar
contadoremcontador.c: ele começa com valor indefinido (zero em prática, mas não garantido para variáveis globais? Na verdade, globais são inicializadas com zero, mas é boa prática inicializar).
Outra forma de resolver
Em vez de variável global, poderia usar uma função get_contador() para encapsular, mas o exercício pede extern.
Saída esperada
3