Szybka odpowiedź: zmień int testlib()
na, int testlib(void)
aby określić, że funkcja nie przyjmuje argumentów.
Prototyp jest z definicji deklaracja funkcja, która określa typ (y) argumentów danej funkcji (S).
Nie-prototypowa deklaracja funkcji, taka jak
int foo();
jest deklaracją w starym stylu, która nie określa liczby ani typów argumentów. (Przed standardem ANSI C z 1989 r. Był to jedyny rodzaj deklaracji funkcji dostępny w tym języku). Możesz wywołać taką funkcję z dowolną liczbą argumentów, a kompilator nie musi narzekać - ale jeśli call jest niezgodne z definicją , Twój program ma niezdefiniowane zachowanie.
W przypadku funkcji, która przyjmuje jeden lub więcej argumentów, możesz określić typ każdego argumentu w deklaracji:
int bar(int x, double y);
Funkcje bez argumentów są przypadkiem specjalnym. Logicznie rzecz biorąc, puste nawiasy byłyby dobrym sposobem określenia tego argumentu, ale ta składnia była już używana w deklaracjach funkcji w starym stylu, więc komitet ANSI C wymyślił nową składnię za pomocą void
słowa kluczowego:
int foo(void); /* foo takes no arguments */
Definicja funkcji (która zawiera kod określający, co funkcja faktycznie robi) również zawiera deklarację . W twoim przypadku masz coś podobnego do:
int testlib()
{
/* code that implements testlib */
}
Zapewnia to deklarację nie będącą prototypem testlib
. Z definicji mówi to kompilatorowi, że testlib
nie ma parametrów, ale jako deklaracja mówi kompilatorowi tylko, że testlib
pobiera nieokreśloną, ale stałą liczbę i typ (y) argumentów.
Po zmianie ()
do (void)
deklaracji staje się prototypem.
Zaletą prototypu jest to, że jeśli przypadkowo wywołasz testlib
jeden lub więcej argumentów, kompilator zdiagnozuje błąd.
(C ++ ma nieco inne zasady. C ++ nie posiada deklaracje funkcji w starym stylu i pustych nawiasów konkretnie oznacza to, że funkcja przyjmuje żadnych argumentów. C ++ obsługuje (void)
składni dla spójności z C. Ale chyba specjalnie potrzebny jest kod do kompilowania zarówno jako C i jako C ++ powinieneś prawdopodobnie użyć ()
w C ++ i (void)
składni w C.)