Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

C Ferramentas Intermediário

Pré-processador

O pré-processador é a primeira etapa da compilação em C. Ele manipula o texto do código-fonte antes da compilação propriamente dita, executando diretivas que começam com #. As mais comuns são #define (definir macros e constantes), #include (incluir arquivos) e compilação condicional (#ifdef, #ifndef, #endif).

Macros com parâmetros funcionam como funções, mas são substituições textuais. Isso as torna muito rápidas (sem custo de chamada de função), porém exigem cuidado com parênteses para evitar resultados inesperados. Já as include guards evitam que um mesmo arquivo de cabeçalho seja incluído mais de uma vez, usando #ifndef/#define/#endif.

Entender o pré-processador é essencial para escrever código portável, organizado e eficiente. Com ele, você pode criar constantes simbólicas, ativar/desativar trechos de código para depuração e garantir que declarações não se repitam.

Pontos-chave

  • #define cria uma macro: uma substituição textual feita antes da compilação.
  • Macros com parâmetros devem usar parênteses ao redor dos argumentos e da expressão para evitar erros de precedência.
  • #ifdef e #ifndef permitem compilar trechos condicionalmente, úteis para debug e portabilidade.
  • Include guards (#ifndef ARQUIVO_H / #define ARQUIVO_H / #endif) previnem múltiplas inclusões do mesmo cabeçalho.
  • O pré-processador não entende tipos nem escopo; ele apenas substitui texto.
preprocessador.c
#include <stdio.h>

// Constante simbólica
#define PI 3.14159

// Macro com parâmetros (note os parênteses)
#define AREA_CIRCULO(r) (PI * (r) * (r))

// Macro para depuração condicional
#define DEBUG 1

int main(void) {
    double raio = 2.0;

    // Uso da macro com parâmetros
    double area = AREA_CIRCULO(raio);
    printf("Area do circulo: %.2f\n", area);

    // Compilação condicional
#ifdef DEBUG
    printf("Modo debug ativado. Raio = %.2f\n", raio);
#else
    printf("Modo release.\n");
#endif

    return 0;
}

Exercícios

  1. 1
    Fácil

    Criando uma macro para o dobro

    Escreva um programa que defina uma macro DOBRO(x) que retorna o dobro de um número. Use essa macro para calcular e imprimir o dobro de 5 e de 3.5.

    Resolver
  2. 2
    Médio

    Compilação condicional com #ifdef

    Crie um programa que defina uma macro MODO_DEBUG. Se MODO_DEBUG estiver definida, o programa deve imprimir "Depurando: valor = X", onde X é o valor de uma variável valor. Caso contrário, deve imprimir apenas "Valor = X". Teste com valor = 42.

    Resolver
  3. 3
    Desafio

    Include guard e macro MAX

    Crie dois arquivos de cabeçalho: utils.h e main.c. O arquivo utils.h deve conter uma include guard e definir uma macro MAX(a,b) que retorna o maior entre dois valores. O arquivo main.c deve incluir utils.h duas vezes (para testar a guarda) e usar a macro MAX para imprimir o maior entre 10 e 20. Compile e execute.

    Resolver

Continue estudando