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 _tmainfirmy 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 charmain.

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ć argcargumentów , argvi 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ściowych argv[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 w argv 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 w argv 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 obiekcie argv.

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ż

Podstawowe pojęcia