main
argomenti della funzione e della riga di comando
Tutti i programmi C++ devono avere una main
funzione. Se si tenta di compilare un programma C++ senza una main
funzione, il compilatore genera un errore. Le librerie e static le librerie a collegamento dinamico non dispongono di una main
funzione. La main
funzione è la posizione in cui il codice sorgente inizia l'esecuzione, ma prima che un programma entri nella main
funzione, tutti i static membri della classe senza inizializzatori espliciti sono impostati su zero. In Microsoft C++, anche gli oggetti globali static vengono inizializzati prima della voce in main
. Diverse restrizioni si applicano alla main
funzione che non si applica ad altre funzioni C++. La funzione main
:
- Non è possibile eseguire l'overload (vedere Overload delle funzioni).
- Non è possibile dichiarare come
inline
. - Non è possibile dichiarare come
static
. - Non può avere il suo indirizzo preso.
- Non è possibile chiamare dal programma.
Firma della main
funzione
La main
funzione non ha una dichiarazione, perché è incorporata nel linguaggio. In caso affermativo, la sintassi della dichiarazione per main
sarà simile alla seguente:
int main();
int main(int argc, char *argv[]);
Se non viene specificato alcun valore restituito in main
, il compilatore fornisce un valore restituito pari a zero.
Argomenti della riga di comando standard
Gli argomenti per main
consentire l'analisi pratica della riga di comando degli argomenti. I tipi per argc
e argv
sono definiti dal linguaggio. I nomi argc
e argv
sono tradizionali, ma è possibile assegnargli un nome qualsiasi.
Le definizioni degli argomenti sono le seguenti:
argc
Intero che contiene il numero di argomenti che seguono in argv. Il parametro argc è sempre maggiore di o uguale a 1.
argv
Una matrice di stringhe con terminazione null che rappresentano gli argomenti della riga di comando immessi dall'utente del programma. Per convenzione, argv[0]
è il comando con cui viene richiamato il programma. argv[1]
è il primo argomento della riga di comando. L'ultimo argomento dalla riga di comando è argv[argc - 1]
e argv[argc]
è sempre NULL.
Per informazioni su come eliminare l'elaborazione della riga di comando, vedere Personalizzare l'elaborazione della riga di comando C++.
Nota
Per convenzione, argv[0]
è il nome file del programma. Tuttavia, in Windows è possibile generare un processo usando CreateProcess
. Se si usano sia il primo che il secondo argomento (lpApplicationName
e lpCommandLine
), argv[0]
potrebbe non essere il nome eseguibile. È possibile usare GetModuleFileName
per recuperare il nome eseguibile e il relativo percorso completo.
Estensioni specifiche di Microsoft
Le sezioni seguenti descrivono il comportamento specifico di Microsoft.
Funzione wmain
e _tmain
macro
Se si progetta il codice sorgente per l'uso di acter a livello Unicode, è possibile usare il punto di ingresso specifico di Microsoft, ovvero la versione wide-acter di .If you design your source code to use Unicode wide characters, you can use the Microsoft-specific wmain
entry point, which is the wide-acterchar version of main
. Ecco la sintassi di dichiarazione effettiva per wmain
:
int wmain();
int wmain(int argc, wchar_t *argv[]);
È anche possibile usare l'oggetto specifico _tmain
di Microsoft, ovvero una macro del preprocessore definita in tchar.h
. _tmain
viene risolto in a main
meno che non _UNICODE
sia definito. In tal caso, _tmain
si risolve in wmain
. La _tmain
macro e altre macro che iniziano con _t
sono utili per il codice che deve compilare versioni separate sia per set di azioni narrow che wide char. Per altre informazioni, vedere Uso di mapping di testo generico.
Restituzione void
da main
Come estensione Microsoft, le main
funzioni e wmain
possono essere dichiarate come restituite void
(nessun valore restituito). Questa estensione è disponibile anche in altri compilatori, ma l'uso non è consigliato. È disponibile per la simmetria quando main
non restituisce un valore.
Se si dichiara main
o wmain
come restituisce void
, non è possibile restituire un exit codice al processo padre o al sistema operativo usando un'istruzione return
. Per restituire un exit codice quando main
o wmain
viene dichiarato come void
, è necessario usare la exit
funzione .
Argomento envp
della riga di comando
Le main
firme o wmain
consentono un'estensione specifica di Microsoft facoltativa per l'accesso alle variabili di ambiente. Questa estensione è comune anche in altri compilatori per sistemi Windows e UNIX. Il nome envp
è tradizionale, ma è possibile denominare il parametro di ambiente in qualsiasi modo. Ecco le dichiarazioni valide per gli elenchi di argomenti che includono il parametro di ambiente:
int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
envp
Il parametro facoltativo envp
è una matrice di stringhe che rappresentano le variabili impostate nell'ambiente dell'utente. Questa matrice viene terminata da una voce NULL. Può essere dichiarato come matrice di puntatori a char
(char *envp[]
) o come puntatore char
a (char **envp
). Se il programma usa wmain
invece di main
, usare il wchar_t
tipo di char
dati anziché .
Il blocco di ambiente passato a main
e wmain
è una copia "bloccata" dell'ambiente corrente. Se in un secondo momento si modifica l'ambiente effettuando una chiamata a putenv
o _wputenv
, l'ambiente corrente (come restituito da getenv
o _wgetenv
e la _environ
variabile o _wenviron
) cambierà, ma il blocco a cui envp
punta non cambierà. Per altre informazioni su come eliminare l'elaborazione dell'ambiente, vedere Personalizzare l'elaborazione della riga di comando C++. L'argomento envp
è compatibile con lo standard C89, ma non con gli standard C++.
Argomenti di esempio per main
Nell'esempio seguente viene illustrato come usare gli argc
argomenti , argv
e envp
per main
:
// argument_definitions.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
int main( int argc, char *argv[], char *envp[] )
{
bool numberLines = false; // Default is no line numbers.
// If /n is passed to the .exe, display numbered listing
// of environment variables.
if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 )
numberLines = true;
// Walk through list of strings until a NULL is encountered.
for ( int i = 0; envp[i] != NULL; ++i )
{
if ( numberLines )
cout << i << ": "; // Prefix with numbers if /n specified
cout << envp[i] << "\n";
}
}
Analisi di argomenti della riga di comando C++
Le regole di analisi della riga di comando usate dal codice Microsoft C/C++ sono specifiche di Microsoft. Il codice di avvio del runtime usa queste regole per interpretare gli argomenti specificati nella riga di comando del sistema operativo:
Gli argomenti sono delimitati da spazi vuoti, ovvero da uno spazio o da una tabulazione.
Il primo argomento (
argv[0]
) viene trattato in modo speciale. Rappresenta il nome del programma. Poiché deve essere un percorso valido, sono consentite parti racchiuse tra virgolette doppie ("
). Le virgolette doppie non sono incluse nell'outputargv[0]
. Le parti racchiuse tra virgolette doppie impediscono l'interpretazione di uno spazio o di un tabulazione charcome fine dell'argomento. Le regole successive in questo elenco non si applicano.Una stringa racchiusa tra virgolette doppie viene interpretata come un singolo argomento, che può contenere gli spazi vuoti char. Una stringa tra virgolette può essere incorporata in un argomento. Il cursore (
^
) non viene riconosciuto come agente di escape charo delimitatore. All'interno di una stringa tra virgolette, una coppia di virgolette doppie viene interpretata come un'unica virgoletta doppia preceduta da un carattere di escape. Se la riga di comando termina prima che venga trovato un segno di virgolette doppie di chiusura, tutti gli character letti finora vengono restituiti come ultimo argomento.Una virgoletta doppia preceduta da una barra rovesciata (
\"
) viene interpretata come un segno di virgolette doppie letterale ("
).Le barre rovesciate vengono interpretate letteralmente, a meno che non precedono immediatamente un segno di virgolette doppie.
Se un numero pari di barre rovesciate è seguito da un segno di virgolette doppie, viene inserita una barra rovesciata (
\
) nellaargv
matrice per ogni coppia di barre rovesciate (\\
) e il segno tra virgolette doppie ("
) viene interpretato come delimitatore di stringa.Se un numero dispari di barre rovesciata è seguito da un segno di virgolette doppie, viene inserita una barra rovesciata (
\
) nellaargv
matrice per ogni coppia di barre rovesciata (\\
). Il segno di virgolette doppie viene interpretato come una sequenza di escape dalla barra rovesciata che stamaintornando, causando l'inserimento di un segno di virgolette doppie letterale ("
) inargv
.
Esempio di analisi degli argomenti della riga di comando
Nel programma seguente viene illustrato come vengono passati gli argomenti della riga di comando:
// command_line_arguments.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char *envp[] ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
cout << "\nCommand-line arguments:\n";
for( count = 0; count < argc; count++ )
cout << " argv[" << count << "] "
<< argv[count] << "\n";
}
Risultati delle righe di comando di analisi
La tabella seguente mostra input di esempio e output previsto, dimostrando le regole dell'elenco precedente.
Input della riga di comando | argv[1] | argv[2] | argv[3] |
---|---|---|---|
"abc" d e |
abc |
d |
e |
a\\b d"e f"g h |
a\\b |
de fg |
h |
a\\\"b c d |
a\"b |
c |
d |
a\\\\"b c" d e |
a\\b c |
d |
e |
a"b"" c d |
ab" c d |
Espansione di caratteri jolly
Il compilatore Microsoft consente facoltativamente di usare i caratteri jollychar, il punto interrogativo (?
) e l'asterisco (*
), per specificare gli argomenti nome file e percorso nella riga di comando.
Gli argomenti della riga di comando vengono gestiti da una routine interna nel codice di avvio del runtime, che per impostazione predefinita non espande i caratteri jolly in stringhe separate nella argv
matrice di stringhe. È possibile abilitare l'espansione con caratteri jolly includendo il setargv.obj
file (wsetargv.obj
file per wmain
) nelle /link
opzioni del compilatore o nella LINK
riga di comando.
Per altre informazioni sulle opzioni del linker di avvio di runtime, vedere Opzioni di collegamento.
Personalizzare l'elaborazione della riga di comando C++
Se il programma non accetta argomenti della riga di comando, è possibile eliminare la routine di elaborazione della riga di comando per risparmiare una piccola quantità di spazio. Per eliminare il relativo uso, includere il noarg.obj
file (sia per main
e wmain
) nelle opzioni del /link
compilatore o nella LINK
riga di comando.
Analogamente, se non si accede mai alla tabella dell'ambiente tramite l'argomento , è possibile eliminare la routine di elaborazione interna dell'ambiente envp
. Per eliminare il relativo uso, includere il noenv.obj
file (sia per main
e wmain
) nelle opzioni del /link
compilatore o nella LINK
riga di comando.
Il programma potrebbe effettuare chiamate alla famiglia o alla spawn
exec
famiglia di routine nella libreria di runtime C. In caso affermativo, non è consigliabile eliminare la routine di elaborazione dell'ambiente, perché viene usata per passare un ambiente dal processo padre al processo figlio.
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per