0Pricing
C Academy · Aula

Guardas de inclusão

Evite a inclusão duplicada.

Guardas de inclusão é uma aula grátis de C Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

O problema da inclusão duplicada

Os cabeçalhos costumam incluir outros cabeçalhos. É fácil que um cabeçalho acabe sendo incluído duas vezes no mesmo arquivo-fonte.

Quando isso acontece, todas as declarações nele aparecem duas vezes. Para definições de tipos como struct ou typedef, isso é um erro de compilação: um tipo não pode ser definido mais de uma vez.

Como isso acontece sem perceber

Suponha que a.h e b.h incluam types.h. Um arquivo-fonte que inclua ambos acabará com types.h copiado duas vezes.

O pré-processador copia cegamente o texto dos cabeçalhos, então as definições de types.h ficam duplicadas, provocando um erro de redefinição.

/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h"   /* types.h now seen twice */

A guarda de inclusão

Uma guarda de inclusão é uma técnica simples do pré-processador que torna seguro incluir um cabeçalho várias vezes.

Ela envolve todo o cabeçalho em uma condicional, para que o corpo seja processado apenas na primeira vez. As inclusões posteriores são totalmente ignoradas.

#ifndef TYPES_H
#define TYPES_H

/* header contents here */

#endif /* TYPES_H */

Como a guarda funciona

Na primeira vez que o cabeçalho é encontrado, TYPES_H não está definido, então #ifndef é verdadeiro e o corpo é processado. Em seguida, #define define a macro.

Em qualquer inclusão posterior, TYPES_H já existe, então #ifndef é falso e o pré-processador avança até #endif.

#ifndef TYPES_H   /* true only the first time */
#define TYPES_H   /* remember we've been here */
/* ... body ... */
#endif

Um cabeçalho completo com guarda

Aqui está um cabeçalho realista com uma guarda protegendo uma definição de tipo.

Mesmo que muitos arquivos incluam point.h direta ou indiretamente, a estrutura Point é definida exatamente uma vez por unidade de tradução.

/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct {
    int x;
    int y;
} Point;

Point point_add(Point a, Point b);

#endif

Escolhendo o nome da macro

A macro da guarda precisa ser exclusiva em todo o projeto, ou dois cabeçalhos podem entrar em conflito e ocultar um ao outro silenciosamente.

Uma convenção comum deriva o nome do nome do arquivo em letras maiúsculas: point.h se torna POINT_H, e net/socket.h se torna NET_SOCKET_H.

#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endif

Evite nomes reservados

Identificadores que começam com um sublinhado seguido de uma letra maiúscula ou que contêm sublinhados duplos são reservados para o compilador e a biblioteca padrão.

Evite guardas como __POINT_H__. Uma forma simples com o sufixo _H, como POINT_H, é segura e clara.

#ifndef _POINT_H_   /* risky: reserved name pattern */
#ifndef POINT_H     /* preferred */

A alternativa #pragma once

A maioria dos compiladores modernos oferece suporte a #pragma once, uma única linha no início de um cabeçalho que cumpre a mesma função.

Ela é mais curta e evita conflitos de nomes, mas não faz parte do padrão C. As guardas tradicionais com #ifndef funcionam em qualquer lugar.

/* point.h */
#pragma once

typedef struct { int x; int y; } Point;

Guardas versus pragma

As guardas com #ifndef são totalmente portáteis e padronizadas, mas exigem uma macro exclusiva para cada cabeçalho.

#pragma once é compacto e não causa conflitos, mas depende do suporte do compilador. Alguns projetos usam ambos: uma pragma junto com uma guarda clássica para obter a máxima segurança.

#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endif

As guardas valem por unidade de tradução

Uma guarda de inclusão impede inclusões duplicadas dentro de um único arquivo-fonte durante sua compilação.

Ela não impede que um cabeçalho seja processado uma vez em cada arquivo .c separado. Isso é adequado, porque cada arquivo-fonte é uma unidade de tradução distinta.

Faça disso um hábito

Adicione uma guarda de inclusão a cada cabeçalho que escrever, desde a primeira linha. Isso custa três linhas e evita toda uma categoria de erros confusos.

Até mesmo cabeçalhos simples podem ser incluídos indiretamente por outros mais tarde, então protegê-los desde o início evita problemas.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endif

Verificação rápida

Verifique sua compreensão das guardas de inclusão.

Recapitulação

Você aprendeu por que incluir um cabeçalho duas vezes causa erros de redefinição e como uma guarda de inclusão evita isso.

Use #ifndef/#define/#endif com uma macro exclusiva ou use #pragma once. Em seguida, veremos como compartilhar variáveis entre arquivos com extern.

Perguntas Frequentes

A aula “Guardas de inclusão” é grátis?

Sim — o texto completo de “Guardas de inclusão” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Guardas de inclusão”?

Evite a inclusão duplicada. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Guardas de inclusão”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Arquivos de cabeçalho e de código-fonte
  2. Guardas de inclusão
  3. extern e ligação
  4. Compilando vários arquivos
← Voltar para C Academy