Originariamente inviata da
MItaly
Non è esattamente così... scrivere void se non ci sono parametri è semplicemente una consuetudine in C++ (e una consuetudine non vista di buon occhio, tra l'altro, visto che è inutile) e in C se si parla di
definizioni di funzioni, mentre in C è necessaria nelle
dichiarazioni per distinguere le funzioni che non hanno parametri (f(void)) da quelle per cui
non sono stati specificati i parametri (f()). In sostanza, se dichiaro una funzione come
e sotto la chiamo con
il compilatore non batterà ciglio, dato che void f() dichiara una funzione di cui non sono specificati i parametri. Nota che questo genererà undefined behavior se poi al momento della
definizione della funzione salterà fuori che f ha dei parametri non corrispondenti a quelli che le sono stati passati, ad esempio:
codice:
void f(void) {
...
}
(su una piattaforma con calling convention a callee-cleanup probabilmente questo scasserà lo stack).
Se invece il prototipo fosse stato
la chiamata f(5.2) avrebbe generato un errore di compilazione.
La questione in generale è abbastanza ingarbugliata e ha a che fare con il C pre-standardizzazione e la relativa sintassi per la dichiarazione delle funzioni, rimando a
qui per una trattazione completa.
Nota comunque che in questo caso specifico questa distinzione non è importante, dato che qui si sta parlando della
definizione del main (non della dichiarazione), dove f() e f(void) sono sostanzialmente equivalenti.
---
Sul return code: è esattamente il contrario di come hai detto. La convenzione più o meno universale (non è limitata solo a Linux) per i tool da riga di comando è che restituiscono 0 se tutto va bene, un numero differente in caso contrario. Nota che c'è una "regola magica" valida solo per il main per cui, se il main non restituisce niente, è come se restituisse zero (regola che consiglio di dimenticare, dato che è valida solo per il main ed è comunque buona pratica restituire esplicitamente sempre l'exit code).