Médio C

Compilação condicional com #ifdef

Enunciado

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.

Requisitos

  • Usar #define MODO_DEBUG (ou comentá-la) para controlar a saída.
  • Usar #ifdef e #else para escolher a mensagem.
  • Imprimir o valor da variável em ambos os casos.

Código inicial

#include <stdio.h>

// Defina MODO_DEBUG aqui

int main(void) {
    int valor = 42;
    // Use #ifdef para imprimir a mensagem correta
    return 0;
}

Saída esperada

Depurando: valor = 42
Ver dica

Coloque #define MODO_DEBUG no início do arquivo e use #ifdef MODO_DEBUG para o bloco de debug.

Mostrar solução
#include <stdio.h>

// Descomente a linha abaixo para ativar o modo debug
#define MODO_DEBUG

int main(void) {
    int valor = 42;

#ifdef MODO_DEBUG
    printf("Depurando: valor = %d\n", valor);
#else
    printf("Valor = %d\n", valor);
#endif

    return 0;
}

Passo a passo

  1. Incluímos <stdio.h> para printf.
  2. Definimos MODO_DEBUG com #define. Se esta linha for comentada, o bloco #else será compilado.
  3. No main, declaramos valor com 42.
  4. A diretiva #ifdef MODO_DEBUG verifica se a macro está definida. Se sim, o compilador inclui o printf de debug.
  5. #else fornece a alternativa para quando MODO_DEBUG não está definida.
  6. #endif encerra o bloco condicional.

Por que funciona

O pré-processador avalia #ifdef antes da compilação. Se a macro estiver definida, o código entre #ifdef e #else é mantido; caso contrário, é descartado. Isso permite criar versões de debug e release sem alterar a lógica principal.

Erros comuns

  • Esquecer o #endif: o compilador emitirá erro de diretiva não terminada.
  • Usar #if em vez de #ifdef: #if MODO_DEBUG só funciona se MODO_DEBUG for definida como 1; se for definida sem valor, #if dará erro. #ifdef é mais seguro para verificar existência.
  • Definir a macro dentro do main: diretivas de pré-processador devem estar fora de funções, preferencialmente no topo do arquivo.

Outra forma de resolver

Use #if defined(MODO_DEBUG) que é equivalente a #ifdef, mas permite combinar com outras condições, como #if defined(DEBUG) && defined(VERBOSE).

Saída esperada

Depurando: valor = 42