Main () è sovraccarico in C ++?

Esistono 2 versioni valide di main() in C++ :

 int main() // version 1 int main(int argc, char **argv) // version 2 

Ma entrambi i sovraccarichi non possono coesistere allo stesso tempo. Perchè no? (Possibile caso d’uso: durante l’esecuzione del programma dal terminale, se non vengono passati argomenti viene chiamata la prima versione, altrimenti la seconda versione è.)

Il compilatore esegue un controllo speciale per consentire solo una versione per binario?

§3.6.1 / 2 (C ++ 03) dice

Un’implementazione non deve predefinire la funzione main . Questa funzione non deve essere sovraccaricata. Deve avere un tipo di ritorno di tipo int, ma in caso contrario il suo tipo è definito dall’implementazione. Tutte le implementazioni devono consentire entrambe le seguenti definizioni di principali:

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

Puoi usare entrambi. Entrambi sono conformi agli standard.

Inoltre, poiché char *argv[] è equivalente a char **argv , sostituendo char *argv[] con char **argv non fa alcuna differenza.


Ma entrambe le versioni non possono coesistere allo stesso tempo! (il caso d’uso può essere simile: mentre si esegue il binario dal prompt dei comandi, se non si passa argomento, la prima versione dovrebbe essere chiamata altrimenti la seconda versione).

No. Entrambe le versioni non possono coesistere allo stesso tempo. Un programma può avere esattamente una funzione main . Quale, dipende dalla tua scelta. Se si desidera elaborare l’argomento della riga di comando, è necessario scegliere la seconda versione, oppure è sufficiente la prima versione. Si noti inoltre che se si utilizza la seconda versione e non si passa alcun argomento della riga di comando, non vi è alcun danno. Non causerà alcun errore. Devi solo interpretare argc e argv conseguenza, e in base al loro valore, devi scrivere la logica e il stream del tuo programma.

Windows e Unix hanno:

 int main(int argc, char **argv, char **envp) 

e le app Win32 hanno:

 int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); 

e MacOS ha:

 int main(int argc, char **argv, char **envp, char **apple) 

Non dimenticare che main non è di solito la prima cosa che il SO chiama quando si esegue un programma. La funzione main è la funzione chiamata dall’ambiente run time. L’indirizzo della prima istruzione da eseguire viene solitamente dichiarato in alcuni metadati, di solito all’inizio se il file eseguibile.

Nessuno dei precedenti contraddice lo standard C / C ++ per quanto posso dire, purché ce ne sia uno solo, il che ha senso dal momento che il sistema operativo non saprebbe quale chiamare se ce ne fosse più di uno. Il controllo ce n’è solo uno non è fatto nel compilatore, è fatto nel linker.

La sezione 3.6.1.2 di entrambe le edizioni C ++ Standard 1998 e 2003:

Un’implementazione non deve predefinire la funzione principale. Questa funzione non deve essere sovraccaricata . Deve avere un tipo di ritorno di tipo int, ma in caso contrario il suo tipo è definito dall’implementazione.

Ulteriore,

Lo standard ISO C ++ (ISO / IEC 14882: 1998) richiede specificamente il ritorno a main int. Ha un esplicito vincolo “deve” su programmi ben formati.

Sezione § 3.6.1 ¶ 2:

Dovrà avere un tipo restituito di int, ma in caso contrario il suo tipo è definito dall’implementazione. Tutte le implementazioni devono consentire entrambe le seguenti definizioni di principali:

 int main() { /* … */ } 

e

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

Quindi entrambe le versioni di main sono consentite dallo standard e quale da usare viene lasciato come una preferenza di implementazione del programmatore.

Main è stato definito di nuovo nei C giorni. È configurato più secondo le regole di printf. Considerare main come una funzione varadica:

 int main(...) 

Lo standard dice che nessun argomento e due argomenti del puntatore sono a posto. Tuttavia, se l’implementazione vuole fornire più argomenti, l’implementazione è libera di farlo.

Il motivo per cui non è ansible avere due s main è la stessa ragione per cui non è ansible definire una printf simile a printf due volte in un programma C. Certo, printf supporta diversi argomenti e modifica il suo comportamento in base a quali argomenti ci sono, ma non è sovraccarico nel senso C ++ del termine.

Lo standard dice che main non può essere sovraccaricato. Non è mutilato e non è ansible avere due funzioni con lo stesso nome senza maglie. Ciò causerà un errore di collegamento, suppongo, ma un compilatore potrebbe voler aggiungere controlli espliciti per fornire messaggi di errore più chiari.

int main(int argc, char **argv) e int main() dovrebbero essere le firme preferite per questo, ma i compilatori sono liberi di accettare un main con parametri diversi.

Non è ansible sovraccaricare main () in C ++ perché. il compilatore ha mostrato il seguente errore:

 error C2731: 'main' : function cannot be overloaded