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 _tmaindi 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 chardati 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 argcargomenti , argve 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'output argv[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 (\) nella argv 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 (\) nella argv 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 (") in argv.

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 spawnexec 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

Concetti di base