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.

sfile1.c
// uvnitr souboru sfile1.c

static void funkce(void)
{
    puts("Byla zavolána funkce() ze souboru sfile1.c");
}
sfile2.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.

překlad
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:

sfile1.c
// 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;
}
sfile2.c
// 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í.
Drobná oprava, doplníme deklaraci funkce1(), jejíž implementace je v souboru sfile1.c, do souboru sfile2.c
// 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;
}
Už to funguje jak má.
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.