C'è differenza tra foo(void) e foo() in C++ o C?
Domanda
Considera queste due definizioni di funzione:
void foo() { }
void foo(void) { }
C'è qualche differenza tra questi due?In caso contrario, perché è il void
discussione lì?Ragioni estetiche?
Soluzione
In C:
void foo()
significa "una funzionefoo
accettando un numero imprecisato di argomenti di tipo non specificato"void foo(void)
significa "una funzionefoo
senza prendere argomenti"
In C++:
void foo()
significa "una funzionefoo
senza prendere argomenti"void foo(void)
significa "una funzionefoo
senza prendere argomenti"
Scrivendo foo(void)
, pertanto, otteniamo la stessa interpretazione in entrambe le lingue e rendiamo le nostre intestazioni multilingue (anche se di solito dobbiamo fare alcune cose in più alle intestazioni per renderle veramente multilingue;vale a dire, avvolgerli in un extern "C"
se stiamo compilando C++).
Altri suggerimenti
Mi rendo conto che la tua domanda riguarda C++, ma quando si tratta di C la risposta può essere trovata in K&R, pagine 72-73:
Inoltre, se una dichiarazione di funzione non include argomenti, come in
double atof();
Anche quello è considerato che non si assume nulla per gli argomenti di ATOF;tutti i controlli dei parametri sono disattivati.Questo significato speciale dell'elenco degli argomenti vuoti ha lo scopo di consentire ai programmi C più vecchi di compilare con nuovi compilatori.Ma è una cattiva idea usarlo con nuovi programmi.Se la funzione accetta argomenti, dichiarali;Se non ci vogliono argomenti, usa il vuoto.
Bozza standard C++11 N3337
Non c'è differenza.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Allegato C "Compatibilità" C.1.7 Clausola 8:dichiaratori dice:
8.3.5 Modifica:In C++, una funzione dichiarata con un elenco di parametri vuoto non accetta argomenti.In C, un elenco di parametri vuoti significa che il numero e il tipo di argomenti della funzione sono sconosciuti.
Esempio:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Fondamento logico:Questo per evitare chiamate di funzione errate (cioè, chiamate di funzione con il numero e il tipo di argomenti errati).
Effetto sulla caratteristica originale:Modifica alla semantica di una caratteristica ben definita.Questa caratteristica è stata contrassegnata come “obsoleta” in C.
8.5.3 funzioni dice:
4.La clausola del parametro-dichiarazione determina gli argomenti che possono essere specificati e la loro elaborazione, quando viene chiamata la funzione....] Se la clausola del parametro-dichiarazione è vuota, la funzione non prende argomenti.L'elenco dei parametri (void) equivale all'elenco dei parametri vuoto.
C99
Come menzionato da C++11, int f()
non specifica nulla sugli argomenti ed è obsoleto.
Può portare a codice funzionante o UB.
Ho interpretato lo standard C99 in dettaglio in: https://stackoverflow.com/a/36292431/895245
In C, si utilizza un vuoto in un riferimento a una funzione vuota in modo che il compilatore abbia un prototipo e quel prototipo non abbia "nessun argomento".In C++ non devi dire al compilatore che hai un prototipo perché non puoi tralasciare il prototipo.