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 em contador.c e declarada extern em contador.h.
  • A função incrementa retorna o novo valor do contador.
  • O main chama incrementa trê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

  1. contador.h contém extern int contador; para informar que a variável existe em outro arquivo.
  2. contador.c inclui o cabeçalho e define int contador = 0; (a definição real).
  3. A função incrementa modifica contador e retorna o novo valor.
  4. main.c inclui contador.h e chama incrementa() três vezes.
  5. Imprimimos contador diretamente, pois extern o torna visível.
  6. 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 .h em vez de extern: se o .h for incluído por vários .c, haverá múltiplas definições e erro de linker.
  • Esquecer extern no .h: cada arquivo que incluir o .h tentará definir a variável, causando conflito.
  • Não inicializar contador em contador.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