Sdílet prostřednictvím


main argumenty funkcí a příkazového řádku

Všechny programy jazyka main C++ musí mít funkci. Pokud se pokusíte zkompilovat program C++ bez main funkce, kompilátor vyvolá chybu. (Knihovny a static knihovny dynamického propojení nemají main funkci.) Funkce main je místo, kde zdrojový kód začíná provádění, ale před vstupem programu do main funkce jsou všechny static členy třídy bez explicitních inicializátorů nastaveny na nulu. V jazyce Microsoft C++ static jsou globální objekty inicializovány také před vstupem do main. Na funkci, která neplatí pro žádné jiné funkce jazyka main C++, platí několik omezení. Funkce main :

  • Nelze přetížit (viz přetížení funkce).
  • Nelze deklarovat jako inline.
  • Nelze deklarovat jako static.
  • Nemůže mít jeho adresu.
  • Nelze volat z programu.

Podpis main funkce

Funkce main nemá deklaraci, protože je integrovaná do jazyka. Pokud ano, syntaxe deklarace by main vypadala takto:

int main();
int main(int argc, char *argv[]);

Pokud není zadána mainžádná návratová hodnota, kompilátor poskytuje návratovou hodnotu nuly.

Standardní argumenty příkazového řádku

Argumenty, které main umožňují pohodlné parsování argumentů pomocí příkazového řádku Typy pro argc jazyk a argv jsou definovány jazykem. Jména argc a argv jsou tradiční, ale můžete je pojmenovat, jak chcete.

Definice argumentů jsou následující:

argc
Celé číslo obsahující počet argumentů, které následují .argv Parametr argc je vždy větší nebo roven 1.

argv
Pole řetězců zakončených znakem null představující argumenty příkazového řádku zadané uživatelem programu. Podle konvence je příkaz, argv[0] se kterým je program vyvolán. argv[1] je první argument příkazového řádku. Poslední argument z příkazového řádku je argv[argc - 1]a argv[argc] je vždy NULL.

Informace o potlačení zpracování příkazového řádku naleznete v tématu Přizpůsobení zpracování příkazového řádku jazyka C++.

Poznámka

Podle konvence argv[0] je název souboru programu. Ve Windows je však možné vytvořit proces pomocí CreateProcess. Pokud použijete první i druhý argument (lpApplicationName a lpCommandLine), argv[0] nemusí být název spustitelného souboru. Můžete použít GetModuleFileName k načtení názvu spustitelného souboru a jeho plně kvalifikované cesty.

Rozšíření specifická pro Microsoft

Následující části popisují chování specifické pro Microsoft.

Funkce wmain a _tmain makro

Pokud navrhujete zdrojový kód tak, aby používal aktéry pro celou charsadu Unicode, můžete použít vstupní bod specifický pro wmain Microsoft, což je verze širokéhochar aktuátoru main. Tady je platná syntaxe deklarace pro wmain:

int wmain();
int wmain(int argc, wchar_t *argv[]);

Můžete také použít specifické _tmainmicrosoft , což je preprocesor makro definované v tchar.h. _tmain se přeloží na main , pokud _UNICODE není definován. V takovém případě _tmain se přeloží na wmain. Makro _tmain a další makra, která začínají, _t jsou užitečná pro kód, který musí sestavovat samostatné verze pro úzké i široké charsady aktérů. Další informace naleznete v tématu Použití mapování obecného textu.

void Vrácení zmain

Jako rozšíření Microsoftu main lze funkce wmain deklarovat void jako návratové (bez návratové hodnoty). Toto rozšíření je také k dispozici v některých dalších kompilátorech, ale jeho použití se nedoporučuje. Je k dispozici pro symetrii, pokud main nevrací hodnotu.

Pokud deklarujete nebo vracíte void, nemůžete vrátit exit kód do nadřazeného procesu nebo operačního systému pomocí return příkazu.wmainmain Chcete-li vrátit exit kód, pokud main nebo wmain je deklarován jako void, je nutné použít exit funkci.

Argument příkazového envp řádku

wmain Podpisy main umožňují volitelné rozšíření specifické pro Microsoft pro přístup k proměnným prostředí. Toto rozšíření je také běžné v jiných kompilátorech pro systémy Windows a systém UNIX. Název envp je tradiční, ale parametr prostředí můžete pojmenovat, jak chcete. Tady jsou efektivní deklarace pro seznamy argumentů, které obsahují parametr prostředí:

int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

envp
Volitelný envp parametr je pole řetězců představujících proměnné nastavené v uživatelském prostředí. Toto pole je ukončeno položkou NULL. Lze ji deklarovat jako pole ukazatelů na char (char *envp[]) nebo jako ukazatel na char (char **envp). Pokud program používá wmain místo , použijte wchar_t datový typ místo charmain.

Blok prostředí předaný main a wmain je "zablokovaná" kopie aktuálního prostředí. Pokud později změníte prostředí voláním putenv nebo _wputenv, aktuální prostředí (jak je vráceno nebo _wgetenv a _environ proměnná_wenviron) se změní, ale blok, na který getenv odkazujeenvp, se nezmění. Další informace o potlačení zpracování prostředí naleznete v tématu Přizpůsobení zpracování příkazového řádku jazyka C++. Argument envp je kompatibilní se standardem C89, ale ne se standardy jazyka C++.

Příklady argumentů pro main

Následující příklad ukazuje, jak použít argc, argva envp argumenty pro 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";
    }
}

Analýza argumentů příkazového řádku jazyka C++

Pravidla analýzy příkazového řádku používaná kódem Microsoft C/C++ jsou specifická pro Microsoft. Spouštěcí kód modulu runtime používá tato pravidla při interpretaci argumentů zadaných na příkazovém řádku operačního systému:

  • Argumenty jsou oddělené prázdným znakem, což je mezera nebo tabulátor.

  • První argument (argv[0]) se zpracovává speciálně. Představuje název programu. Protože musí být platným názvem cesty, jsou části obklopené dvojitými uvozovkami (") povoleny. Do výstupu argv[0] nejsou zahrnuty dvojité uvozovky. Části obklopené dvojitými uvozovkami brání interpretaci mezery nebo ovládacích znaků tabulátoru charjako konce argumentu. Pozdější pravidla v tomto seznamu se nevztahují.

  • Řetězec obklopený dvojitými uvozovkami se interpretuje jako jeden argument, který může obsahovat mezery char. Do argumentu lze vložit řetězec s uvozovými znaky. Stříšku (^) se nerozpozná jako řídicí charaktér nebo oddělovač. V uvozovkách se dvojice dvojitých uvozovek interpretuje jako jednoduchá uvozovka s jednoduchým uvozovkou. Pokud se příkazový řádek ukončí před uzavírací dvojitou uvozovkou, budou všechny charaktéry přečtené zatím výstupem jako poslední argument.

  • Dvojitá uvozovka před lomítkem (\") se interpretuje jako literálová uvozovka (").

  • Zpětné lomítka se interpretují doslova, pokud bezprostředně před dvojitou uvozovkou nejdou.

  • Pokud za dvojitou uvozovkou následuje sudý počet zpětných lomítek, pak se jedno zpětné lomítko (\) umístí do argv pole pro každou dvojici zpětných lomítek (\\) a dvojitá uvozovka (") se interpretuje jako oddělovač řetězců.

  • Pokud je lichý počet zpětných lomítek následovaný dvojitou uvozovkou, je jedno zpětné lomítko (\) umístěné v argv poli pro každou dvojici zpětných lomítek (\\). Dvojitá uvozovka je interpretována jako řídicí sekvence zpětnýmmainlomítkem, což způsobuje umístění literálové uvozovky (") do argv.

Příklad analýzy argumentů příkazového řádku

Následující program ukazuje, jak se předávají argumenty příkazového řádku:

// 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";
}

Výsledky analýzy příkazového řádku

Následující tabulka ukazuje příklad vstupu a očekávaného výstupu, který demonstruje pravidla v předchozím seznamu.

Vstup příkazového řádku 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

Rozšíření zástupného znaku

Kompilátor Microsoftu volitelně umožňuje používat zástupnécharotazníky, otazník (?) a hvězdičku (*) k zadání argumentů názvu souboru a cesty na příkazovém řádku.

Argumenty příkazového řádku jsou zpracovávány interní rutinou v spouštěcím kódu modulu runtime, který ve výchozím nastavení nerozbaluje zástupné znaky do samostatných řetězců v argv řetězcovém poli. Rozšíření zástupných znaků můžete povolit zahrnutím setargv.obj souboru (wsetargv.obj souboru pro wmain) do /link možností kompilátoru nebo LINK příkazového řádku.

Další informace o možnostech spouštěcího linkeru modulu runtime najdete v tématu Možnosti propojení.

Přizpůsobení zpracování příkazového řádku C++

Pokud program nepřebírají argumenty příkazového řádku, můžete potlačit rutinu zpracování příkazového řádku a ušetřit tak malé místo. Pokud chcete potlačit jeho použití, zahrňte noarg.obj/link soubor (pro obojí main iwmain) do možností kompilátoru nebo LINK do příkazového řádku.

Podobně platí, že pokud nikdy nepřistupujete k tabulce prostředí prostřednictvím argumentu envp , můžete potlačit interní rutinu zpracování prostředí. Pokud chcete potlačit jeho použití, zahrňte noenv.obj/link soubor (pro obojí main iwmain) do možností kompilátoru nebo LINK do příkazového řádku.

Program může volat rutiny spawn v knihovně modulu runtime jazyka C nebo exec jejich řadu. Pokud ano, neměli byste potlačit rutinu zpracování prostředí, protože se používá k předání prostředí z nadřazeného procesu do podřízeného procesu.

Viz také

Základní koncepty