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?

È stato utile?

Soluzione

In C:

  • void foo() significa "una funzione foo accettando un numero imprecisato di argomenti di tipo non specificato"
  • void foo(void) significa "una funzione foo senza prendere argomenti"

In C++:

  • void foo() significa "una funzione foo senza prendere argomenti"
  • void foo(void) significa "una funzione foo 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top