Compartilhar via


Especificadores de classe de armazenamento para declarações em nível externo

Variáveis externas são variáveis no escopo do arquivo.Elas estão definidas fora de qualquer função e são potencialmente disponíveis para muitas funções.Funções só podem ser definidas no nível externo e, portanto, não podem ser aninhadas.Por padrão, todas as referências a variáveis externas e funções de mesmo nome são referências ao mesmo objeto, o que significa que eles têm "ligação externa". (Você pode usar o estático palavra-chave para substituí-lo.Consulte as informações nesta seção para obter mais detalhes sobre estático.)

Declarações de variáveis no nível externo são ambos definições de variáveis ("Definindo declarações") ou referências para as variáveis definidas em outros lugares ("declarações de referência").

Uma declaração de variável externa que também inicializa a variável (implicitamente ou explicitamente) é uma declaração de definição da variável.Uma definição no nível externo pode tomar vários formulários:

  • Uma variável que você declara com a estático o especificador de classe de armazenamento.Você pode inicializar explicitamente o estático variável com uma expressão constante, conforme descrito em inicialização.Se você omitir o inicializador, a variável é inicializada para 0 por padrão.Por exemplo, essas duas instruções são ambas as definições consideradas da variável k.

    static int k = 16;
    static int k;
    
  • Uma variável que você inicializa explicitamente no nível externo.Por exemplo, int j = 3; é uma definição da variável j.

Nas declarações de variável no nível externo (ou seja, fora de todas as funções), você pode usar o estático ou extern o especificador de classe de armazenamento ou omita o especificador de classe de armazenamento completamente.Não é possível usar o auto e registrarespecificador de classe de armazenamento terminais no nível externo. 

Assim que uma variável é definida no nível externo, é visível durante todo o restante da unidade de conversão.A variável não é visível antes da sua declaração no mesmo arquivo de origem.Além disso, ele não é visível em outros arquivos de origem do programa, a menos que uma declaração de referência torna visível, conforme descrito abaixo.

As regras relativas ao estático incluem:

  • As variáveis declaradas fora todos os blocos sem o estático palavra-chave sempre retêm seus valores em todo o programa.Para restringir o acesso a uma unidade determinada tradução, você deve usar o estático palavra-chave.Isso permite que eles "ligação interna". Para torná-los globais para um programa inteiro, omita a classe de armazenamento explícito ou usar a palavra-chave extern (consulte as regras na lista seguinte).Isso permite que eles "ligação externa". Ligação interna e externa também são discutidas no ligação.

  • Você pode definir uma variável com a externa nível apenas uma vez dentro de um programa.Você pode definir outra variável com o mesmo nome e o estático especificador de classe de armazenamento em uma unidade de conversão diferentes.Pois cada estático definição é visível somente dentro sua própria unidade de conversão, nenhum conflito ocorre.Isso fornece uma maneira útil ocultar os nomes de identificador devem ser compartilhado entre funções de uma única unidade de conversão, mas não estejam visíveis para outras unidades de conversão.

  • O estático o especificador de classe de armazenamento pode ser aplicadas às funções também.Se você declarar uma função estático, seu nome é invisível fora do arquivo no qual é declarada.

As regras para usar extern são:

  • O extern o especificador de classe de armazenamento declara uma referência a uma variável definida em outro lugar.Você pode usar um extern declaração para tornar uma definição em outro arquivo de origem visível ou para fazer uma variável visível antes da sua definição no mesmo arquivo de origem.Depois de ter declarado uma referência à variável no nível externo, a variável é visível durante todo o restante da unidade de tradução, no qual a referência declarada ocorre.

  • Para um extern de referência para ser válido, refere-se a variável deve ser definida uma vez e apenas uma vez, no nível externo.Essa definição (sem o extern classe de armazenamento) pode estar em qualquer uma das unidades que compõem o programa de conversão.

Exemplo

O exemplo a seguir ilustra as declarações externas:

/******************************************************************
                      SOURCE FILE ONE 
*******************************************************************/
#include <stdio.h>

extern int i;                // Reference to i, defined below 
void next( void );           // Function prototype            

int main()
{
    i++;
    printf_s( "%d\n", i );   // i equals 4 
    next();
}

int i = 3;                  // Definition of i

void next( void )
{
    i++;
    printf_s( "%d\n", i );  // i equals 5
    other();
}

/******************************************************************
                      SOURCE FILE TWO 
*******************************************************************/
#include <stdio.h>

extern int i;              // Reference to i in 
                           // first source file 
void other( void )
{
    i++;
    printf_s( "%d\n", i ); // i equals 6 
}

Os dois arquivos de origem neste exemplo contenham um total de três declarações externas de i.Somente uma declaração é uma "declaração de definição". Essa declaração,

int i = 3;

Define a variável global i e o inicializa com valor inicial 3.A declaração "referência" de i na parte superior do primeiro arquivo fonte usando extern faz com que a variável global visível antes da sua declaração de definição no arquivo.A declaração de referência de i na fonte do segunda arquivo também torna a variável visível no arquivo de origem.Se uma instância de definição para uma variável não for fornecida na unidade de conversão, o compilador pressupõe que há um

extern int x;

fazendo referência a declaração e que uma definição de referência.

int x = 0;

é exibida em outra unidade de conversão do programa.

Todas as três funções, main, next, e other, executar a mesma tarefa: elas aumentam i e imprimi-lo.Os valores de 4, 5 e 6 são impressos.

Se a variável i não tinha sido inicializado, ele seria foram definido como 0 automaticamente.Nesse caso, os valores 1, 2 e 3 seriam tiverem sido impressos.Consulte inicialização para obter informações sobre a inicialização da variável.

Consulte também

Referência

C Classes de armazenamento