Proteções de inclusão
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 2 de 61.
Quando um arquivo de cabeçalho é incluído várias vezes em um projeto, o compilador vê as mesmas declarações repetidamente, causando erros. Isso acontece com frequência quando vários arquivos incluem o mesmo cabeçalho ou quando cabeçalhos incluem uns aos outros. As proteções de inclusão resolvem esse problema.
Uma proteção de inclusão usa três diretivas do pré-processador para garantir que o conteúdo de um cabeçalho seja processado apenas uma vez:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
Veja como funciona: #ifndef MATH_UTILS_H verifica se o símbolo MATH_UTILS_H ainda não foi definido. Se não tiver sido, o pré-processador continua e o define imediatamente com #define MATH_UTILS_H. Tudo entre esse ponto e #endif é incluído na compilação.
Na segunda vez que esse cabeçalho é incluído, MATH_UTILS_H já está definido, então todo o bloco é ignorado. O nome da proteção geralmente é o nome do arquivo em letras maiúsculas, com sublinhados no lugar de pontos e caracteres especiais.
Todo arquivo de cabeçalho que você criar deve ter guardas de inclusão. Essa é uma prática padrão que evita erros de compilação e permite incluir seu código com segurança em qualquer lugar do projeto.
Desafio
FácilVamos proteger um arquivo de cabeçalho contra inclusões duplicadas adicionando guardas de inclusão. Você vai desenvolver a partir do utilitário de saudação da lição anterior, mas desta vez vai garantir que seja seguro incluir o cabeçalho várias vezes.
Você vai criar dois arquivos:
greet.h: Seu arquivo de cabeçalho, que contém a declaração da funçãogreet. Desta vez, envolva todo o conteúdo com guardas de inclusão usando o símboloGREET_H.main.c: Seu arquivo principal, que inclui o cabeçalho, implementa a funçãogreete a chama demain().
A função greet deve aceitar um parâmetro const char* para o nome e imprimir:
Hello, Alice!Seu arquivo de cabeçalho deve seguir esta estrutura:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifVocê receberá uma entrada: um nome (string).
Imprima a mensagem de saudação exatamente como mostrado no formato acima, substituindo Alice pelo nome fornecido.
Experimente você mesmo
#include <stdio.h>
#include "greet.h"
// TODO: Implemente a função greet que imprime "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: Chame a função greet com o nome
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online