As diferenças de static em C
Onde static é usado e como ele afeta o programa
-
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)
-
Persistência Local: persiste o valor, mas visivel somente ao escopo da função.
static operation = WHITENESS
-
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.