Isso é útil quando você tem variáveis globais. Você declara a existência de variáveis globais em um cabeçalho, para que cada arquivo de origem que inclua o cabeçalho saiba sobre ele, mas você só precisa “defini-lo” uma vez em um dos seus arquivos de origem.
Para esclarecer, usar extern int x;
informa ao compilador que um objeto do tipo int
chamado x
existe em algum lugar . Não é tarefa dos compiladores saber onde ele existe, ele só precisa saber o tipo e o nome para saber como usá-lo. Depois que todos os arquivos de origem forem compilados, o vinculador resolverá todas as referências x
à definição encontrada em um dos arquivos de origem compilados. Para que funcione, a definição da x
variável precisa ter o que é chamado de "ligação externa", o que basicamente significa que precisa ser declarada fora de uma função (no que geralmente é chamado de "escopo do arquivo") e sem a static
palavra - chave.
cabeçalho:
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
fonte 1:
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
fonte 2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
extern
em várias ocasiões. As ferramentas da Microsoft produziram um erro de link para os símbolos ausentes quando as tabelas em outro arquivo de origem foram definidas apenas. O problema era que a tabela estavaconst
e o compilador C ++ a promoveustatic
na unidade de tradução. Veja, por exemplo,ariatab.cpp
ekalynatab.cpp
.