main
argumenty funkcji i wiersza polecenia
Wszystkie programy języka C++ muszą mieć main
funkcję. Jeśli spróbujesz skompilować program C++ bez main
funkcji, kompilator zgłosi błąd. (Biblioteki i static biblioteki linku dynamicznego main
nie mają funkcji). Funkcja main
to miejsce, w którym kod źródłowy rozpoczyna wykonywanie, ale zanim program wejdzie do main
funkcji, wszystkie static składowe klasy bez jawnych inicjatorów są ustawione na zero. W języku Microsoft C++, obiekty globalne static są również inicjowane przed wpisem do main
. Do funkcji, która nie ma zastosowania do żadnych innych funkcji języka C++, ma zastosowanie main
kilka ograniczeń. Funkcja main
:
- Nie można przeciążyć (zobacz Przeciążenie funkcji).
- Nie można zadeklarować jako
inline
. - Nie można zadeklarować jako
static
. - Nie można podjąć jego adresu.
- Nie można wywołać z programu.
Podpis main
funkcji
Funkcja main
nie ma deklaracji, ponieważ jest wbudowana w język. Jeśli tak, składnia deklaracji dla main
elementu będzie wyglądać następująco:
int main();
int main(int argc, char *argv[]);
Jeśli wartość zwracana nie jest określona w parametrze main
, kompilator dostarcza wartość zwracaną zera.
Standardowe argumenty wiersza polecenia
Argumenty umożliwiające main
wygodne analizowanie argumentów w wierszu polecenia. Typy dla argc
i argv
są definiowane przez język . Nazwy argc
i argv
są tradycyjne, ale można je nazwać dowolnie.
Definicje argumentów są następujące:
argc
Liczba całkowita zawierająca liczbę argumentów, które następują w argvpliku . Parametr argc jest zawsze większy lub równy 1.
argv
Tablica ciągów zakończonych znakiem null, która reprezentuje argumenty wiersza polecenia wprowadzone przez użytkownika programu. Zgodnie z konwencją jest poleceniem, argv[0]
za pomocą którego wywoływany jest program. argv[1]
jest pierwszym argumentem wiersza polecenia. Ostatnim argumentem z wiersza polecenia jest argv[argc - 1]
, i argv[argc]
zawsze ma wartość NULL.
Aby uzyskać informacje na temat pomijania przetwarzania wiersza polecenia, zobacz Dostosowywanie przetwarzania wiersza polecenia języka C++.
Uwaga
Zgodnie z konwencją jest argv[0]
nazwą pliku programu. Jednak w systemie Windows można zduplikować proces przy użyciu polecenia CreateProcess
. Jeśli używasz zarówno pierwszych, jak i drugich argumentów (lpApplicationName
i lpCommandLine
), argv[0]
może nie być nazwą pliku wykonywalnego. Możesz użyć GetModuleFileName
polecenia , aby pobrać nazwę pliku wykonywalnego i jego w pełni kwalifikowaną ścieżkę.
Rozszerzenia specyficzne dla firmy Microsoft
W poniższych sekcjach opisano zachowanie specyficzne dla firmy Microsoft.
Funkcja wmain
i _tmain
makro
Jeśli projektujesz kod źródłowy do używania programów acter szerokiego charformatu Unicode, możesz użyć punktu wejścia specyficznego dla wmain
firmy Microsoft, który jest wersją szerokochar działającego programu main
. Oto obowiązująca składnia deklaracji dla elementu wmain
:
int wmain();
int wmain(int argc, wchar_t *argv[]);
Można również użyć specyficznego dla _tmain
firmy Microsoft makra preprocesora zdefiniowanego w programie tchar.h
. _tmain
rozwiązuje wartość , main
chyba że _UNICODE
jest zdefiniowana. W takim przypadku _tmain
jest rozpoznawana wartość wmain
. Makro i inne makra _tmain
, które zaczynają się _t
od, są przydatne w przypadku kodu, który musi tworzyć oddzielne wersje zarówno dla wąskich, jak i szerokich charzestawów aktualizatorów. Aby uzyskać więcej informacji, zobacz Using generic-text mappings (Używanie mapowań tekstu ogólnego).
void
Powrót zmain
Jako rozszerzenie main
firmy Microsoft funkcje i wmain
można zadeklarować jako zwracane (bez wartości zwracanej void
). To rozszerzenie jest również dostępne w innych kompilatorach, ale jego użycie nie jest zalecane. Jest ona dostępna dla symetrii, gdy main
nie zwraca wartości.
Jeśli zadeklarowasz main
lub wmain
jako zwracasz void
, nie możesz zwrócić exit kodu do procesu nadrzędnego lub systemu operacyjnego przy użyciu return
instrukcji . Aby zwrócić exit kod, gdy main
lub wmain
jest zadeklarowany jako void
, należy użyć exit
funkcji .
envp
Argument wiersza polecenia
Sygnatury main
lub wmain
umożliwiają opcjonalne rozszerzenie specyficzne dla firmy Microsoft w celu uzyskania dostępu do zmiennych środowiskowych. To rozszerzenie jest również powszechne w innych kompilatorach dla systemów Windows i system UNIX. Nazwa envp
jest tradycyjna, ale możesz nazwać parametr środowiska dowolną nazwą. Oto obowiązujące deklaracje dla list argumentów, które zawierają parametr środowiska:
int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
envp
Opcjonalny envp
parametr to tablica ciągów reprezentujących zmienne ustawione w środowisku użytkownika. Ta tablica jest przerywana przez wpis o wartości NULL. Można go zadeklarować jako tablicę wskaźników do char
(char *envp[]
) lub jako wskaźnik do wskaźników do char
(char **envp
). Jeśli program używa wmain
zamiast , użyj wchar_t
typu danych zamiast char
main
.
Blok środowiska przekazany do main
elementu i wmain
jest "zamrożoną" kopią bieżącego środowiska. Jeśli później zmienisz środowisko przez wywołanie metody putenv
lub _wputenv
, bieżące środowisko (zwracane przez getenv
lub _wgetenv
i _environ
zmienną lub _wenviron
) zmieni się, ale blok wskazywany przez envp
nie ulegnie zmianie. Aby uzyskać więcej informacji na temat pomijania przetwarzania środowiska, zobacz Dostosowywanie przetwarzania wiersza polecenia języka C++. Argument envp
jest zgodny ze standardem C89, ale nie ze standardami języka C++.
Przykładowe argumenty do main
W poniższym przykładzie pokazano, jak używać argc
argumentów , argv
i envp
do 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";
}
}
Analizowanie argumentów wiersza polecenia języka C++
Reguły analizowania wiersza polecenia używane przez kod Microsoft C/C++ są specyficzne dla firmy Microsoft. Kod uruchamiania środowiska uruchomieniowego używa tych reguł podczas interpretowania argumentów podanych w wierszu polecenia systemu operacyjnego:
Argumenty są rozdzielane białym znakiem, czyli spacją lub kartą.
Pierwszy argument (
argv[0]
) jest traktowany specjalnie. Reprezentuje nazwę programu. Ponieważ musi być prawidłową nazwą ścieżki, części otoczone podwójnymi cudzysłowami ("
) są dozwolone. Znaki podwójnego cudzysłowu nie są uwzględniane w danych wyjściowychargv[0]
. Części otoczone podwójnym cudzysłowem uniemożliwiają interpretację spacji lub tabulatora charjako końca argumentu. Późniejsze reguły na tej liście nie mają zastosowania.Ciąg otoczony podwójnym cudzysłowem jest interpretowany jako pojedynczy argument, który może zawierać znaki znaków odstępu char. Ciąg cudzysłów można osadzić w argumencie. Daszek (
^
) nie jest rozpoznawany jako aktuer ucieczki charlub ogranicznik. W cudzysłowie parą podwójnych znaków cudzysłowu jest interpretowana jako pojedynczy znak cudzysłowu z znakiem ucieczki. Jeśli wiersz polecenia kończy się przed odnalezieniem zamykającego podwójnego cudzysłowu, wszystkie charosoby uruchamiające odczytane do tej pory są danymi wyjściowymi jako ostatni argument.Podwójny cudzysłów poprzedzony ukośnikiem odwrotnym (
\"
) jest interpretowany jako znak podwójnego cudzysłowu literału ("
).Ukośniki odwrotne są interpretowane dosłownie, chyba że bezpośrednio poprzedzają znak podwójnego cudzysłowu.
Jeśli po znaku podwójnego cudzysłowu następuje parzysta liczba ukośników odwrotnych (), jeden ukośnik odwrotny (
\
) jest umieszczany wargv
tablicy dla każdej pary ukośników odwrotnych (\\
), a znak podwójnego cudzysłowu ("
) jest interpretowany jako ogranicznik ciągu.Jeśli po znaku podwójnego cudzysłowu następuje nieparzysta liczba ukośników odwrotnych (), jeden ukośnik odwrotny (
\
) zostanie umieszczony wargv
tablicy dla każdej pary ukośników odwrotnych (\\
). Znak podwójnego cudzysłowu jest interpretowany jako sekwencja ucieczki przezmainukośnik odwrotny, powodując umieszczenie znaku podwójnego cudzysłowu literału ("
) w obiekcieargv
.
Przykład analizowania argumentów wiersza polecenia
Poniższy program pokazuje, jak są przekazywane argumenty wiersza polecenia:
// 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";
}
Wyniki analizowania wierszy polecenia
W poniższej tabeli przedstawiono przykładowe dane wejściowe i oczekiwane dane wyjściowe, przedstawiające reguły na powyższej liście.
Dane wejściowe wiersza polecenia | 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 |
Rozwijanie symbolu wieloznacznego
Kompilator firmy Microsoft opcjonalnie umożliwia używanie symboli wieloznacznychchar, znaku zapytania (?
) i gwiazdki (*
) w celu określenia nazwy pliku i argumentów ścieżki w wierszu polecenia.
Argumenty wiersza polecenia są obsługiwane przez wewnętrzną procedurę w kodzie uruchamiania środowiska uruchomieniowego, który domyślnie nie rozszerza symboli wieloznacznych na oddzielne ciągi w argv
tablicy ciągów. Rozszerzenie symboli setargv.obj
wieloznacznych można włączyć, dołączając plik (wsetargv.obj
plik dla wmain
) w /link
opcjach kompilatora lub w LINK
wierszu polecenia.
Aby uzyskać więcej informacji na temat opcji konsolidatora uruchamiania środowiska uruchomieniowego, zobacz Opcje łącza.
Dostosowywanie przetwarzania wiersza polecenia języka C++
Jeśli program nie bierze argumentów wiersza polecenia, możesz pominąć procedurę przetwarzania wiersza polecenia, aby zaoszczędzić niewielką ilość miejsca. Aby pominąć jego użycie, dołącz noarg.obj
plik (zarówno dla , jak main
i wmain
) w /link
opcjach kompilatora lub w LINK
wierszu polecenia.
Podobnie, jeśli nigdy nie uzyskujesz dostępu do tabeli środowiska za pośrednictwem argumentu envp
, możesz pominąć wewnętrzną procedurę przetwarzania środowiska. Aby pominąć jego użycie, dołącz noenv.obj
plik (zarówno dla , jak main
i wmain
) w /link
opcjach kompilatora lub w LINK
wierszu polecenia.
Program może wykonywać wywołania do spawn
rodziny procedur lub exec
w bibliotece środowiska uruchomieniowego języka C. W przeciwnym razie nie należy pomijać procedury przetwarzania środowiska, ponieważ jest ona używana do przekazywania środowiska z procesu nadrzędnego do procesu podrzędnego.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla