Desafio C
Include guard e macro MAX
Enunciado
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.
Requisitos
utils.hdeve ter include guard com#ifndef UTILS_H,#define UTILS_He#endif.utils.hdeve definir a macroMAX(a,b)corretamente parentizada.main.cdeve incluirutils.hduas vezes.- O programa deve imprimir
O maior e: 20.
Código inicial
// utils.h
#ifndef UTILS_H
#define UTILS_H
// Defina a macro MAX aqui
#endif
// main.c
#include <stdio.h>
#include "utils.h"
#include "utils.h" // segunda inclusão
int main(void) {
// Use MAX e imprima
return 0;
}
Saída esperada
O maior e: 20
Ver dica
A macro MAX deve ser algo como #define MAX(a,b) ((a) > (b) ? (a) : (b)). A include guard evita que o conteúdo seja duplicado.
Mostrar solução
utils.h
#ifndef UTILS_H
#define UTILS_H
// Macro que retorna o maior entre dois valores
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
main.c
#include <stdio.h>
#include "utils.h"
#include "utils.h" // segunda inclusão: a guarda impede duplicação
int main(void) {
int x = 10, y = 20;
printf("O maior e: %d\n", MAX(x, y));
return 0;
}
Passo a passo
- Em
utils.h, a diretiva#ifndef UTILS_Hverifica seUTILS_Hainda não foi definida. - Se não foi,
#define UTILS_Hdefine a macro de controle. - Em seguida, definimos a macro
MAX(a,b)com parênteses extras para garantir a precedência correta. #endiffecha o bloco condicional.- Em
main.c, incluímosutils.hduas vezes. Na primeira,UTILS_Hé definida e o conteúdo é processado. Na segunda,#ifndef UTILS_Hé falso, então o conteúdo é ignorado. - Usamos
MAX(x, y)dentro doprintf. O pré-processador expande para((x) > (y) ? (x) : (y)), que avalia para 20.
Por que funciona
A include guard garante que o conteúdo do cabeçalho seja incluído apenas uma vez por unidade de compilação. Sem ela, a segunda inclusão causaria redefinição da macro MAX, o que é um erro (ou aviso) em C. A macro MAX funciona para qualquer tipo comparável com >, desde que os parênteses preservem a ordem de avaliação.
Erros comuns
- Esquecer o
#endif: erro de pré-processamento. - Nome da guarda conflitante: usar
#ifndef UTILS_Hem outro arquivo pode causar conflito. Use nomes únicos, comoUTILS_H. - Macro MAX sem parênteses:
#define MAX(a,b) a > b ? a : b. Se usada em2 * MAX(3,4), a expansão vira2 * 3 > 4 ? 3 : 4, resultando em6 > 4 ? 3 : 4→3, incorreto. Corrija com((a) > (b) ? (a) : (b)). - Efeitos colaterais:
MAX(i++, j)pode incrementariduas vezes. Evite argumentos com efeitos colaterais.
Outra forma de resolver
Use uma função inline em vez de macro:
static inline int max_int(int a, int b) { return a > b ? a : b; }
Isso evita problemas de duplicação de argumentos e é mais seguro, mas não é genérico para todos os tipos.
Saída esperada
O maior e: 20