Post

As diferenças de static em C

Onde static é usado e como ele afeta o programa

  1. Função: a função pode ser acessada somente no escopo da Translation Unit (internal). Até pode ser chamada em outras translation unit caso eu passe o ponteiro para ela. Mas não pode ser chamadas pelo NOME da função. someFunctionOutside(&functionInternal)

  2. Persistência Local: persiste o valor, mas visivel somente ao escopo da função. static operation = WHITENESS

  3. Variável global interna: Persiste o valor globalmente por Translation Unit. Ou seja, essa variável é visível somente na translation unit atual, logo outras unidades/arquivo nao podem acessá-las. Ele também inicializada com zero automaticamente. Agora, se voce compilar para que tudo seja uma única unidade de tradução, sua variavel será completamente global, faz sentido!?

1
2
static int x; // -> global - visivel somente na translation unit (internal)
int x;        // -> global - visivel em todas as translation units

Exemplo de static (internal linkage vs. external linkage)

Exemplo 1:

1
2
3
4
5
// test.cpp
static int hello = 4;
   
// main.cpp
int hello = 14;

compile OK! O linker irá se preocupar somente com a translation unit (.obj) do test.obj, ou seja, a variavel hello é interna nesse arquivo (internal linkage)

Exemplo 2:

1
2
3
4
5
// test.cpp
int hello = 4;

// main.cpp
int hello = 14;

compile ERROR! O linker irá olhar para todas as variáveis e verá que existe 2 variáveis globais com o mesmo nome.

Exemplo 3:

1
2
3
4
5
// test.cpp
int hello = 4;

// main.cpp
extern int hello;

compile OK! Agora, o linker verá que a variavel hello (main) é uma referencia para a variavel hello (test) devido ao extern. Logo, o erro desaparece porque agora temos de fato somente uma única variável global. (external linkage)

Exemplo 4:

1
2
3
4
5
// test.cpp
static int hello = 4;
 
// main.cpp
extern int hello;

compile ERROR! O linker tentará olhar para um variavel global que esteja em outra translation unit. Mas a (hello) foi declarada como internal, logo, ele mostrará o erro de external symbol error. Ou seja, ele não encontrou nenhum simbolo disponivel para linkar (lembra, ele é internal agora)

Em resumo, uma variavel static é uma variável global somente para a translation unit atual. E por fim, se compilarmos nosso programa usando Single-Translation Unit, teremos uma variável completamente global (pq tudo é um único translation unit).

Todas as functions são external linkage. Logo, não precisamos definir extern.

Esta postagem está licenciada sob CC BY 4.0 pelo autor.