Risposta rapida: passare int testlib()
a int testlib(void)
per specificare che la funzione non accetta argomenti.
Un prototipo è per definizione una dichiarazione di funzione che specifica il tipo (i) degli argomenti della funzione.
Una dichiarazione di funzione non prototipo come
int foo();
è una dichiarazione vecchio stile che non specifica il numero o il tipo di argomenti. (Prima dello standard ANSI C del 1989, questo era l'unico tipo di dichiarazione di funzione disponibile nella lingua.) È possibile chiamare tale funzione con qualsiasi numero arbitrario di argomenti e il compilatore non è tenuto a lamentarsi, ma se il la chiamata non è coerente con la definizione , il programma ha un comportamento indefinito.
Per una funzione che accetta uno o più argomenti, è possibile specificare il tipo di ciascun argomento nella dichiarazione:
int bar(int x, double y);
Le funzioni senza argomenti sono un caso speciale. Logicamente, le parentesi vuote sarebbero state un buon modo per specificare che un argomento, ma che la sintassi era già in uso per dichiarazioni di funzioni vecchio stile, quindi il comitato ANSI C ha inventato una nuova sintassi usando la void
parola chiave:
int foo(void); /* foo takes no arguments */
Una definizione di funzione (che include il codice per ciò che fa effettivamente la funzione) fornisce anche una dichiarazione . Nel tuo caso, hai qualcosa di simile a:
int testlib()
{
/* code that implements testlib */
}
Questo fornisce una dichiarazione non prototipo per testlib
. Come definizione, questo dice al compilatore che testlib
non ha parametri, ma come una dichiarazione, dice solo al compilatore che testlib
accetta alcuni numeri e tipi di argomenti non specificati ma fissi.
Se si ()
passa (void)
alla dichiarazione diventa un prototipo.
Il vantaggio di un prototipo è che se si chiama accidentalmente testlib
uno o più argomenti, il compilatore diagnostica l'errore.
(C ++ ha regole leggermente diverse. C ++ non ha dichiarazioni di funzioni vecchio stile e le parentesi vuote significano specificamente che una funzione non accetta argomenti. C ++ supporta la (void)
sintassi per coerenza con C. Ma a meno che non sia necessario il proprio codice per compilare entrambi come C e come C ++, probabilmente dovresti usare ()
in C ++ e la (void)
sintassi in C.)