extern e ligação
Compartilhe símbolos entre arquivos.
extern e ligação é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 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 que é ligação?
Ligação descreve se um nome pode ser compartilhado entre diferentes arquivos-fonte.
Um nome com ligação externa se refere à mesma entidade em todo o programa. Um nome com ligação interna é privado do próprio arquivo. Entender a ligação é fundamental para programas com vários arquivos.
Compartilhando uma variável
Suponha que dois arquivos precisem acessar um contador global. Não é possível simplesmente defini-lo nos dois arquivos; isso cria duas variáveis separadas e um erro de vinculação de símbolo duplicado.
Em vez disso, defina-o uma vez e declare-o em todos os outros arquivos usando extern.
/* config.c */
int g_count = 0; /* the one definition */A palavra-chave extern
extern informa ao compilador que uma variável existe em outro lugar do programa, sem criar espaço de armazenamento para ela aqui.
É uma declaração pura. Posteriormente, o vinculador a associa à única definição existente em outro arquivo.
/* other.c */
extern int g_count; /* declared, not defined */
void bump(void) {
g_count++;
}Declaração no cabeçalho
O padrão adequado é colocar a declaração extern em um cabeçalho e a definição correspondente em exatamente um arquivo de código-fonte.
Assim, qualquer arquivo que inclua o cabeçalho poderá usar a variável compartilhada.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endifUma definição, muitas declarações
Esta é a Regra de Uma Definição para elementos globais: uma variável pode ser declarada com extern em vários arquivos, mas pode ser definida em apenas um.
A única definição (sem extern) aloca o espaço de armazenamento. Todas as declarações com extern apenas apontam para ela.
/* config.h */ extern int g_count; /* declaration */
/* config.c */ int g_count = 0; /* definition */As funções também têm ligação externa
Por padrão, as funções também têm ligação externa, e é por isso que um protótipo em um cabeçalho permite que outros arquivos as chamem.
Você pode escrever extern antes de um protótipo, mas isso é redundante; as funções são externas, a menos que você indique o contrário.
/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);Ligação interna com static
A palavra-chave static no escopo do arquivo dá a um nome ligação interna: ele fica visível apenas dentro do próprio arquivo de código-fonte.
Use-a para auxiliares e elementos globais que devem permanecer privados de um módulo. Outros arquivos não podem acessá-los nem entrar em conflito com eles.
/* parser.c */
static int line_no = 0; /* private to parser.c */
static void advance(void) { /* private helper */
line_no++;
}extern versus static
Essas duas palavras-chave ficam em extremos opostos da ligação.
extern solicita ligação externa: compartilhe este nome entre arquivos. static no escopo do arquivo força a ligação interna: mantenha este nome privado. Escolher corretamente controla o que seu módulo expõe.
extern int shared_total; /* visible everywhere */
static int local_cache; /* only this file */Um erro comum
Às vezes, iniciantes colocam uma definição simples como int g_count; em um cabeçalho.
Como o cabeçalho é incluído em vários arquivos, cada arquivo recebe sua própria definição e o vinculador informa um símbolo duplicado. Sempre faça a declaração com extern no cabeçalho e defina uma vez em um arquivo .c.
/* WRONG in a header included twice */
int g_count; /* multiple definition */
/* RIGHT */
extern int g_count; /* declaration only */Juntando tudo
Esta estrutura de três arquivos é a maneira padrão de compartilhar estado.
O cabeçalho declara, um arquivo de código-fonte define e os demais usam o elemento depois de incluir o cabeçalho. O vinculador conecta todas as referências à única definição.
/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
int g_count = 0;
/* main.c */ #include "config.h"
/* uses g_count */Observação sobre inicialização
Apenas a definição real deve fornecer um valor inicial: int g_count = 0;.
Uma declaração extern não deve inicializar a variável, pois não aloca espaço de armazenamento. Escrever extern int g_count = 0; transforma a declaração em uma definição e anula o objetivo.
extern int g_count; /* ok: declaration */
extern int g_count = 0; /* becomes a definition */Verificação rápida
Verifique seu entendimento sobre extern e ligação.
Recapitulação
Você aprendeu que a ligação controla a visibilidade entre arquivos. extern declara um nome definido em outro lugar; static no escopo do arquivo mantém um nome privado.
Compartilhe elementos globais com uma definição e declarações extern. Em seguida, compilaremos e vincularemos esses arquivos em um programa.
Perguntas Frequentes
A aula “extern e ligação” é grátis?
Sim — o texto completo de “extern e ligaçã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 “extern e ligação”?
Compartilhe símbolos entre arquivos. 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 3 de 4.
Quanto tempo leva a aula “extern e ligaçã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
- Arquivos de cabeçalho e de código-fonte
- Guardas de inclusão
- extern e ligação
- Compilando vários arquivos