Deklaracja funkcji static w pliku nagłówkowym

0

Witam,
Zwracam się z pytaniem gdzie należy zadeklarować i zdefiniować funkcję w C aby była widoczna tylko w jednym plików źródłowym.
Mam takie pliki:

plik1.c

#include "plik1.h"
void funkcja1()
{
funkcja2();
}
static void funkcja2()
{
}
 

plik2.c

#include "plik1.h"
int main()
{
funkcja1();
}
 

plik1.h


extern void funkcja1();
static void funkcja2();
 

Kompliator w takiej sytuacje zwraca warning " funkcja2() declared static but never defined". Z pliku nagłówkowego nie mogę deklaracji usunąć bo wtedy w plik1.c funkcja2() będzie nie widoczna dla funkcja1(). Rozwiązanie przesunięcia definicji funkcji2() nad definicję funkcji1() nie wchodzi w grę bo przedstawiłem tu uproszczony obraz sytuacji. Więc gdzie umieścić deklarację funkcji static.

0

Jeśli funkcja ma być tylko widoczna w jednym pliku C, to robię to tak:

#include "plik1.h"
// deklaracje wszystkich statycznych funkcji
static void funkcja2();

// Definicje funkcji
void funkcja1()
{
funkcja2();
}
static void funkcja2()
{
}

Nie umieszczaj deklaracji w pliku H.

0

To zależy co dokładnie chcesz osiągnąć.
Słowo kluczowe static powoduje, że dany symbol jest widoczny tylko i wyłącznie w tym pliku *.c w którym został zdefiniowany.
Żadne extern itp tego nie zmieni.
Umieszczenie symbolu static w nagłówku spowoduje, że za każdym razem, gdy dołączysz ten plik nagłówkowy do jakiegoś pliku *.c zdefiniujesz ten symbol na nowo. Przykładowo, zmienna ze słowem static w pliku nagłówkowym, spowoduje, że będzie tworzona osobna instancja tej zmiennej dla każdego pliku źródłowego, gdzie ten plik nagłówkowy wystąpi. Właśnie dlatego dostajesz ostrzeżenie "funkcja2() declared static but never defined".
Wniosek jest prosty static i plik nagłówkowy w C nie powinny występować razem.

Jeśli piszesz jakaś bibliotekę, to funkcje prywatne, które będą używane w różnych modułach twojej biblioteki, ale nie mają być widoczne na zewnątrz:

#deklarację funkcji umieszczasz w osobnych plikach nagłówkowych, które nie podlegają dystrybucji
#ten plik nagłówkowy dołączasz tylko i wyłącznie z plików źródłowych swojej biblioteki tam gdzie funkcja ma być użyta.
#deklaracji nie poprzedzasz żadnym słowem kluczowym (zapomnij o static).

1 użytkowników online, w tym zalogowanych: 0, gości: 1