In C, questo:
void printBind();
non è un prototipo. Dichiara una funzione che non restituisce nulla (void
) ma prende un elenco indeterminato di argomenti. (Tuttavia, tale elenco di argomenti non è variabile; tutte le funzioni che assumono un elenco di argomenti di lunghezza variabile devono avere un prototipo completo di portata per evitare un comportamento indefinito.)
void printBind(void);
Questo è un prototipo per la funzione che non tiene argomenti.
Le regole in C++ sono diverse: la prima dichiara una funzione senza argomenti ed è equivalente alla seconda.
Il motivo della differenza è storico (leggi 'risale alla metà degli anni '80'). Quando i prototipi sono stati introdotti in C (alcuni anni dopo sono stati aggiunti a C++), esisteva un'enorme eredità di codice che dichiarava funzioni senza elenco di argomenti (perché non era un'opzione prima che i prototipi venissero aggiunti), quindi le considerazioni sulla compatibilità all'indietro significavano che SomeType *SomeFunction();
doveva continuare a significare 'una funzione che restituisce un valore SomeType *
ma per il quale non sappiamo nulla dell'elenco degli argomenti'. C++ alla fine ha aggiunto la notazione SomeType *SomeFunction(void);
per la compatibilità con C, ma non ne ha avuto bisogno poiché il collegamento di tipo sicuro è stato aggiunto in anticipo e tutte le funzioni necessitavano di un prototipo in ambito prima che fossero definite o utilizzate.
fonte
2012-03-02 23:58:17
Anche se ora capisco il motivo dell'errore, non capisco l'utilità di questa funzione. Quando definiresti una funzione con un elenco di parametri indeterminato e cosa ha a che fare esattamente ciò con C++? È una funzionalità utile in C++? – sherrellbc
Non è possibile definire un prototipo con un elenco di argomenti indeterminato in C++. In C++, ciò significa "senza argomenti", non "argomenti indeterminati". La funzione non è tanto utile quanto una concessione necessaria alla realtà. Quando C fu standardizzato, l'intera vasta base di codice fu scritta senza prototipi; non erano esistiti in C. La notazione della parentesi vuota era tutto ciò che c'era in pre-standard C. Per essere dichiarato fuori legge avrebbe ucciso lo standard C nascente. Questo era ancora vero per C99. Era meno chiaro per C11, ma è rimasto invariato. –