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
#ifdefe#elsepara 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
- Incluímos
<stdio.h>paraprintf. - Definimos
MODO_DEBUGcom#define. Se esta linha for comentada, o bloco#elseserá compilado. - No
main, declaramosvalorcom 42. - A diretiva
#ifdef MODO_DEBUGverifica se a macro está definida. Se sim, o compilador inclui oprintfde debug. #elsefornece a alternativa para quandoMODO_DEBUGnão está definida.#endifencerra 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
#ifem vez de#ifdef:#if MODO_DEBUGsó funciona seMODO_DEBUGfor definida como 1; se for definida sem valor,#ifdará 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