Gli argomenti della firma di main in C ++ possono avere i qualificatori unsigned e const? [duplicare]

StackOverflow https://stackoverflow.com/questions/1621574

  •  06-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

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?

È stato utile?

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 di main : int main () e int 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.

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