Variável global - Global variable
Em programação de computador , uma variável global é uma variável com escopo global , o que significa que é visível (portanto, acessível) em todo o programa, a menos que esteja sombreada . O conjunto de todas as variáveis globais é conhecido como ambiente global ou estado global. Em linguagens compiladas , as variáveis globais são geralmente variáveis estáticas , cuja extensão (tempo de vida) é todo o tempo de execução do programa, embora em linguagens interpretadas (incluindo interpretadores de linha de comando ), as variáveis globais são geralmente alocadas dinamicamente quando declaradas, uma vez que não são conhecidas antes do tempo.
Em algumas linguagens, todas as variáveis são globais, ou globais por padrão, enquanto na maioria das linguagens modernas as variáveis têm escopo limitado, geralmente escopo léxico , embora as variáveis globais estejam frequentemente disponíveis declarando uma variável no nível superior do programa. Em outras linguagens, entretanto, variáveis globais não existem; geralmente são linguagens de programação modulares que impõem uma estrutura de módulo ou linguagens de programação orientadas a objetos baseadas em classes que impõem uma estrutura de classes.
Usar
Os mecanismos de interação com variáveis globais são chamados de mecanismos de ambiente global (ver também estado global ). O paradigma do ambiente global é contrastado com o paradigma do ambiente local , onde todas as variáveis são locais sem memória compartilhada (e, portanto, todas as interações podem ser reconduzidas para a passagem de mensagens ).
Variáveis globais são usadas extensivamente para passar informações entre seções de código que não compartilham uma relação chamador / receptor, como threads simultâneos e manipuladores de sinal. As linguagens (incluindo C) em que cada arquivo define um namespace implícito eliminam a maioria dos problemas vistos com linguagens com um namespace global, embora alguns problemas possam persistir sem o encapsulamento adequado. Sem o bloqueio adequado (como com um mutex ), o código que usa variáveis globais não será seguro para thread, exceto para valores somente leitura na memória protegida .
Variáveis ambientais
Variáveis de ambiente são um recurso fornecido por alguns sistemas operacionais . No shell do sistema operacional ( ksh no Unix , bash no Linux , COMMAND.COM no DOS e CMD.EXE no Windows ), eles são um tipo de variável: por exemplo, no unix e sistemas relacionados, uma variável comum se torna uma variável de ambiente quando a export
palavra - chave é usado. O código do programa diferente de shells deve acessá-los por chamadas de API , como
getenv()
e setenv()
.
Eles são locais para o processo no qual foram definidos. Isso significa que se abrirmos duas janelas de terminal (dois processos diferentes executando shell) e alterarmos o valor da variável de ambiente em uma janela, essa alteração não será vista por outra janela.
Quando um processo filho é criado, ele herda todas as variáveis de ambiente e seus valores do processo pai. Normalmente, quando um programa chama outro programa, ele primeiro cria um processo filho por bifurcação , em seguida, o filho ajusta o ambiente conforme necessário e, por último, o filho se substitui pelo programa a ser chamado. Os processos filhos, portanto, não podem usar variáveis de ambiente para se comunicar com seus pares, evitando o problema de ação à distância.
Apenas global e global por padrão
Uma série de linguagens não estruturadas , como (versões anteriores de) BASIC , COBOL e Fortran I (1956) fornecem apenas variáveis globais. Fortran II (1958) introduziu sub-rotinas com variáveis locais e a palavra-chave COMMON para acessar variáveis globais. O uso de COMMON em FORTRAN continuou em FORTRAN 77 e influenciou linguagens posteriores, como PL / SQL. Grupos COMUM nomeados para globais se comportam de forma semelhante a namespaces estruturados. As variáveis também são globais por padrão em FORTH , Lua , Perl e na maioria dos shells.
Por idioma
C e C ++
A linguagem C não possui uma global
palavra - chave . No entanto, as variáveis declaradas fora de uma função têm "escopo de arquivo", o que significa que são visíveis dentro do arquivo. As variáveis declaradas com o escopo do arquivo são visíveis entre sua declaração e o final da unidade de compilação ( .c
arquivo) (a menos que sejam sombreadas por um objeto com o mesmo nome em um escopo mais próximo, como uma variável local); e eles implicitamente têm ligação externa e, portanto, são visíveis não apenas para o .c
arquivo ou unidade de compilação que contém suas declarações, mas também para todas as outras unidades de compilação que estão vinculadas para formar o programa completo. A ligação externa, entretanto, não é suficiente para o uso de tal variável em outros arquivos: para uma unidade de compilação acessar corretamente tal variável global, ela precisará saber seu tipo. Isso é feito declarando a variável em cada arquivo usando a extern
palavra - chave. (Ele será declarado em cada arquivo, mas pode ser definido em apenas um.) Tais extern
declarações são freqüentemente colocadas em um arquivo de cabeçalho compartilhado, uma vez que é prática comum para todos os arquivos .c em um projeto incluir pelo menos um .h
arquivo: o padrão O arquivo de cabeçalho errno.h
é um exemplo, tornando a errno
variável acessível a todos os módulos de um projeto. Onde este mecanismo de acesso global for considerado problemático, ele pode ser desabilitado usando a static
palavra - chave que restringe uma variável ao escopo do arquivo e causará tentativas de importá-la extern
para gerar um erro de compilação (ou link).
Um exemplo de variável "global" em C :
#include <stdio.h>
// This is the file-scope variable (with internal linkage), visible only in
// this compilation unit.
static int shared = 3;
// This one has external linkage (not limited to this compilation unit).
extern int over_shared;
// Also internal linkage.
int over_shared_too = 2;
static void ChangeShared() {
// Reference to the file-scope variable in a function.
shared = 5;
}
static void LocalShadow() {
// Local variable that will hide the global of the same name.
int shared;
// This will affect only the local variable and will have no effect on the
// file-scope variable of the same name.
shared = 1000;
}
static void ParamShadow(int shared) {
// This will affect only the parameter and will have no effect on the file-
// scope variable of the same name.
shared = -shared;
}
int main() {
// Reference to the file-scope variable.
printf("%d\n", shared);
ChangeShared();
printf("%d\n", shared);
LocalShadow();
printf("%d\n", shared);
ParamShadow(1);
printf("%d\n", shared);
return 0;
}
Como a variável é externa, não há necessidade de passá-la como parâmetro para utilizá-la em uma função além da principal. Ele pertence a todas as funções do módulo.
O resultado será:
3 5 5 5
Java
Algumas linguagens, como Java, não possuem variáveis globais. Em Java, todas as variáveis que não são variáveis locais são campos de uma classe. Portanto, todas as variáveis estão no escopo de uma classe ou de um método. Em Java, os campos estáticos (também conhecidos como variáveis de classe ) existem independentemente de quaisquer instâncias da classe e uma cópia é compartilhada entre todas as instâncias; portanto, os campos estáticos públicos são usados para muitas das mesmas finalidades que as variáveis globais em outras linguagens devido ao seu comportamento de "compartilhamento" semelhante:
public class Global {
public static int a;
}
PHP
PHP tem uma global
palavra - chave e várias maneiras incomuns de usar variáveis globais. As variáveis declaradas fora das funções têm escopo de arquivo (que é, para a maioria dos propósitos, o escopo mais amplo). No entanto, eles não são acessíveis dentro das funções a menos que importados com a global
palavra - chave (ou seja, a palavra-chave acessa variáveis globais, ela não as declara ).
No entanto, algumas variáveis predefinidas, conhecidas como superglobais, estão sempre acessíveis. Eles são todos matrizes. Um de propósito geral é o $GLOBALS
superglobal, que contém todas as variáveis definidas fora do escopo da função. Mudanças em seus elementos mudam as variáveis originais e adições criam novas variáveis. Os superglobals $_POST
e $_GET
são amplamente utilizados em programação web.
Outras línguas
- Em Python e MATLAB, uma variável global pode ser declarada em qualquer lugar com a
global
palavra - chave. -
As variáveis globais de Ruby são distinguidas por um símbolo '
$
' . Existem vários globais predefinidos, por exemplo, é o ID do processo atual .$$