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é _tmain
microsoft , 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.wmain
main
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 char
main
.
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
, argv
a 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ýstupuargv[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í doargv
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é vargv
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 ("
) doargv
.
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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro