V jazyce C jsou funkce implicitně globální. Klíčové slovo static před jménem funkce z ní udělá statickou funkci.
static int funkce(void)
{
printf("Já jsem staticka funkce.\n");
return;
}
int jina_funkce(void)
{
printf("A já jsem globální funkce, mě může volat kdokoliv, heč.\n");
return;
}
Globální funkce jsou dostupné jak v tom samém céčkovém souboru, tak i ve všech ostatních souborech našeho projektu.
Přístup ke statickým funkcím je povolen jenom v tom samém souboru, kde je funkce deklarována. Takže pokud chceme omezit přístup k nějaké funkci z jiných souborů projektu, uděláme ji statickou.
Další uplatnění statických funkcí je takové, že můžeme používat v různách souborech projektu funkce stejného jména.
// uvnitr souboru sfile1.c
static void funkce(void)
{
puts("Byla zavolána funkce() ze souboru sfile1.c");
}
// uvnitr jiného souboru sfile2.c
int main(void)
{
funkce();
getchar();
return 0;
}
Pokud budeme chtít přeložit náš projekt sestávající se ze souborů sfile1.c a sfile2.c, tak to nepůjde.
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ gcc -o staticke_funkce sfile1.c sfile2.c (1)
sfile1.c: In function ‘funkce’:
sfile1.c:5:5: warning: implicit declaration of function ‘puts’ [-Wimplicit-function-declaration]
5 | puts("Byla zavolána funkce() ze souboru sfile1.c");
| ^~~~
sfile2.c: In function ‘main’:
sfile2.c:5:5: warning: implicit declaration of function ‘funkce’ [-Wimplicit-function-declaration]
5 | funkce();
| ^~~~~~
sfile2.c:6:5: warning: implicit declaration of function ‘getchar’ [-Wimplicit-function-declaration]
6 | getchar();
| ^~~~~~~
sfile2.c:1:1: note: ‘getchar’ is defined in header ‘<stdio.h>’; did you forget to ‘#include <stdio.h>’?
+++ |+#include <stdio.h>
1 | // uvnitr jiného souboru sfile2.c
/usr/bin/ld: /tmp/ccCbGU9J.o: in function `main': (2)
sfile2.c:(.text+0xe): undefined reference to `funkce'
collect2: error: ld returned 1 exit status
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$
| 1 | Sestavení projektu. |
| 2 | Nadává linker, že nemůže sestavit program. |
Upravíme naše céčkové soubory:
// uvnitr souboru sfile1.c
#include <stdio.h>
static void funkce(void)
{
puts("Byla zavolána funkce() ze souboru sfile1.c.\n");
return;
}
void funkce1(void)
{
funkce();
return;
}
// uvnitr jiného souboru sfile2.c
#include <stdio.h>
static void funkce(void)
{
puts("Já jsem funkce() ze souboru sfile2.c\n");
return;
}
int main(void)
{
funkce();
funkce1();
getchar();
return 0;
}
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ gcc -o staticke_funkce sfile1.c sfile2.c (1)
sfile2.c: In function ‘main’:
sfile2.c:13:5: warning: implicit declaration of function ‘funkce1’; did you mean ‘funkce’? [-Wimplicit-function-declaration] (2)
13 | funkce1();
| ^~~~~~~
| funkce
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ ./staticke_funkce
Já jsem funkce() ze souboru sfile2.c
Byla zavolána funkce() ze souboru sfile1.c.
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$
| 1 | Sestavení projektu. |
| 2 | Kompilátor ještě trochu nadává, protože nezná deklaraci funkce1 z jiného souboru sfile1.c, program se však přeloží a sestaví. |
// uvnitr jiného souboru sfile2.c
#include <stdio.h>
static void funkce(void)
{
puts("Já jsem funkce() ze souboru sfile2.c\n");
return;
}
void funkce1(void); // deklarace funkce 1
int main(void)
{
funkce();
funkce1();
getchar();
return 0;
}
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ gcc -o staticke_funkce sfile1.c sfile2.c
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$ ./staticke_funkce
Já jsem funkce() ze souboru sfile2.c
Byla zavolána funkce() ze souboru sfile1.c.
jirka@jirka-Precision-T3610:~/vyuka_sspvc/c_programming$
Závěr
Naučili jsme se, jak fungují statické funkce a ještě navíc jsme si ukázali, jak přeložit projekt, který se skládá z více zdrojových souborů *.c.