0Pricing
C Academy · Aula

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;
#endif

Uma 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

  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