Gli argomenti della firma di main in C ++ possono avere i qualificatori unsigned e const? [duplicare]
Domanda
Questa domanda ha già una risposta qui:
- Cosa dovrebbe restituire main () in C e C ++? 17 risposte
Lo standard afferma esplicitamente che main
ha due firme valide (cioè garantite per funzionare); vale a dire:
int main();
int main(int, char*[]);
La mia domanda è semplice, qualcosa di simile al seguente sarebbe legale?
int main(const unsigned int, const char* const* argv);
I miei test dicono "sì", ma non sono sicuro della risposta perché non sto sovraccaricando main
cambiando int
in unsigned int
così come la const
non di livello superiore di argv? Se lo sono, è chiaramente vietato.
Quindi, queste modifiche sono garantite per funzionare su un compilatore conforme agli standard?
Soluzione
Lo standard C ++ 98 dice nella sezione 3.6.1 paragrafo 2
Un'implementazione non deve predefinire la funzione principale. Questa funzione non deve essere sovraccaricata. Deve avere un tipo restituito di tipo
int
, ma per il resto il suo tipo è definito dall'implementazione. Tutte le implementazioni devono consentire entrambe le seguenti definizioni dimain
:int main ()
eint main (int argc, char * argv [])
Quindi non è obbligatorio per lo standard che l'env che accetta main
sia accettabile ma è lecito.
Poiché questo è spesso citato, ecco il paragrafo precedente che esenta gli ambienti indipendenti da tutto tranne che documentarne il comportamento:
Un programma deve contenere una funzione globale chiamata main, che è l'inizio designato del programma. È implementazione definita se è necessario un programma in un ambiente indipendente per definire un main funzione. [Nota: in un ambiente indipendente, avvio e la risoluzione è definita dall'implementazione; avviare contiene l'esecuzione di costruttori per oggetti con ambito dello spazio dei nomi con durata dell'archiviazione statica; fine contiene l'esecuzione di distruttori per oggetti con durata di archiviazione statica. ]
Altri suggerimenti
È necessario utilizzare una delle firme conformi agli standard per essere conformi agli standard.
Capisco perfettamente perché vuoi farlo a modo tuo. Il modo migliore è scrivere la tua funzione myMain () o qualsiasi altra cosa con la firma che desideri e chiamarla da main (), inclusi i cast richiesti.
I puntatori argv
non dovrebbero essere const char * const
perché al programma è permesso cambiare i buffer.
Per quanto posso vedere leggendo lo standard, sei non conforme agli standard. Ma non riesco a immaginare un compilatore che non ti permetterebbe di farlo. Come in, ci vorrebbe più lavoro da parte del compilatore per vietare specificamente un caso limite che è per lo più innocuo e molto oscuro.
Questo potrebbe non funzionare se il compilatore utilizza la modifica del nome per main
. Dopotutto è una funzione C ++. Quindi, il linker cercherà due "manipolazioni" particolari. La tua definizione avrebbe un altro nome alterato.
Nota che main
è speciale (non sovraccarica, non è richiamabile) e potrebbe non richiedere affatto la modifica del nome.
Potresti essere illegale secondo lo standard, ma alla maggior parte dei runtime non importa davvero. Spingeranno semplicemente un numero intero per argc
e un puntatore per argv
, chiameranno il tuo main
e sperano che tu li analizzi nel modo giusto. Quindi, a tuo avviso, "garantito di funzionare" è discutibile in quanto al caricatore non importa davvero come hai dichiarato gli argomenti.
Se costruisce, verrà chiamato main
. Il modo in cui analizzi gli argomenti dipende da te. Dovrei chiarire che questo è altamente specifico per la piattaforma, come quasi quasi l'intera domanda.
Detto questo, perché?
ISO / IEC 9899: TC3
Sezione 5.1.2.2.1 Avvio del programma
La funzione chiamata all'avvio del programma è denominata main. L'implementazione dichiara n prototipo per questa funzione. Deve essere definito con un tipo di ritorno di int e con n Parametri:
int main(void) { /* ... */ }
o con due parametri (indicato qui come argc e argv, anche se possono esserci nomi usato, poiché sono locali alla funzione in cui sono dichiarati):
int main(int argc, char *argv[]) { /* ... */ }
o equivalente; 9) o in qualche altro modo definito dall'implementazione.