O especificador extern
é usado nas declarações de variáveis e funções (exceto membros de classe ou parâmetros de função). Ele especifica a ligação externa e não afeta tecnicamente a duração do armazenamento, mas não pode ser usado em uma definição de um objeto de duração de armazenamento automático, portanto, todos os objetos extern
têm durações estáticas ou de encadeamento.
Isso é útil quando você tem variáveis globais e declara a existência delas em um cabeçalho, de forma que cada arquivo de origem que inclui o cabeçalho saiba sobre ele, mas você só precisa “defini-lo” uma vez em um de seus arquivos de origem.
Exemplo, Suponhamos que você tenha 3 arquivos e fará link de dois arquivos:
vim global.hpp
#ifndef GLOBAL_H
#define GLOBAL_H
// qualquer arquivo que incluir esse cabeçalho será capaz de usar "var_global"
extern float var_global;
void the_func();
#endif
vim global.cpp
#include <iostream>
#include "global.hpp"
void the_func(){
// imprime a variável global:
std::cout << var_global << '\n';
}
vim main.cpp
#include "global.hpp"
// ela será definida aqui
float var_global;
int main(){
var_global = 9.36f;
the_func();
}
Após compilar a saída será: 9.36, mas disponível para todos os arquivos.
Outra forma de uso da palavra-chave extern
é para compilar projetos C++ em C, por exemplo.
Suponhamos que você está escrevendo um plugin/extensão para um programa escrito C, mas está usando C++, então você pode alterar o contexto do seu código para C .
Exemplo:
#include <iostream>
extern "C" {
namespace terroo {
class DarthVader{
public:
DarthVader(){
std::cout << "Eu sou o seu pai." << '\n';
}
~DarthVader(){
std::cout << "Nãããããããããooooooooo ..." << '\n';
}
};
}
}
int main( int argc , char **argv ){
terroo::DarthVader t;
return 0;
}
Se um programa for escrito em C ele funcionará com esse código, mesmo usando classes, construtores, destrutores, namespace,…
Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !
Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:
Acesse o endereço: