2010-09-14 25 views

risposta

10

Nessuna differenza in circostanze normali. Questo non è un 'argomento predefinito per main()', poiché non ha argomenti.

Ecco la circostanza non ordinaria. Se scrivi la tua chiamata al principale, allora () ti permetterà di passare qualsiasi parametro che ti piace, mentre lo (void) ti costringerà a passarlo nessuno. Tuttavia, nessuno di questi aspetti riguarda il caso del 99,9999,999%, che viene invocato dal runtime per avviare il programma. Il runtime non sa né si preoccupa se si scrive () o (void).

Se si codifica lo standard int main(int argc, char **argv), si otterranno i parametri della riga di comando.

+0

+1 - in C++ non c'è differenza, ma c'è una leggera differenza in C. È minore però. –

+1

'" Nessuna differenza "', leggi il post di Billy. –

+0

@Billy: questa domanda è stata codificata con C non C++. –

8

main() consente di chiamare main con qualsiasi numero di parametri. main(void) obbliga a chiamare il principale senza parametri. Quindi:

main(foo, bar); 

va bene main() ma non con main(void) - il compilatore genera un errore.

Ora, se stai chiedendo specificamente del punto di ingresso del programma, non fa davvero la differenza; in entrambi i casi, non saranno disponibili gli argomenti per il programma (argc, argv, envp).

+7

+1 - nota che 'envp' è un'estensione non standard. –

+0

@Billy ONeal: consentito dallo standard in §5.1.2.2.1.1. –

+1

@ Matt: non ho mai detto che non era permesso. Ho appena detto che non era nello standard. –

2

Dal punto di vista pratico, non c'è alcuna differenza reale. Con int main(void), si sta esplicitamente affermando che main non accetta parametri, quindi non è possibile richiamarlo con alcuno. Con int main(), si lascia aperta la possibilità di invocare main con alcuni parametri.

Tuttavia, tranne in strane situazioni come codice golf o codice intenzionalmente offuscato, non si richiama comunque main - è il punto di ingresso al programma, quindi viene richiamato automaticamente dal codice di avvio. Il codice di avvio passerà comunque gli argomenti della riga di comando, quindi le tue scelte non cambiano il modo in cui viene invocato, solo se usi o ignori i parametri che vengono superati.

Lo standard non specificamente consentono di definire main con o senza parametri (§5.1.2.2.1/1):

La funzione chiamata all'avvio del programma prende il nome principale. L'implementazione non dichiara il prototipo per questa funzione.Essa è definita con un tipo di ritorno di int e senza parametri:

int main(void) { /* ... */ } 

o con due parametri (qui indicati come argc e argv, se tutti i nomi possono essere , poiché essi sono locali alla funzione in cui sono dichiarate):

int main(int argc, char *argv[]) { /* ... */ } 

o equivalente;

Anche se è fuori dai tag specificati, in C++ la situazione è leggermente diversa. In C, una dichiarazione di funzione come:

int f(); 

specifica che f è una funzione che restituisce un int, ma dà non informazioni sul numero o il tipo di parametri f potrebbe aspettare (questo è incluso in primo luogo per la compatibilità con i vecchi codice - allo stesso tempo, questo era il solo modo di dichiarare una funzione in C). In C++, la stessa dichiarazione dichiara esplicitamente f come una funzione che non accetta parametri, quindi il tentativo di invocare f con uno o più parametri non può richiamare questa funzione (deve richiamare un altro sovraccarico o produrre un errore se non si trova un sovraccarico adatto).

+0

@Jens: No, non ci sono riuscito, perché non era pertinente alla domanda in questione. Sì, potrebbero esserci altri modi possibili per invocare main, ma almeno questi due sono assolutamente consentiti. Sì, potrebbe teoricamente restituire un altro tipo, ma l'OP sembra riguardare solo i parametri, non il tipo restituito. –

+1

Scusa se ti sei sentito offeso. Quello che segue da questa frase, però, è che un'implementazione potrebbe anche permettere alla versione 'int main()' con qualsiasi numero di parametri. –

+0

@JerryCoffin, domanda veloce. Come invochereste un sovraccarico se la funzione è f()? Stavo guardando questo esempio di locklessinc (punto) com/articles/overloading/ma sembra che tu abbia bisogno di un parametro per questo. Grazie – BluePython