W wielu IDE i kompilatorach C ++, gdy generuje ono dla ciebie główną funkcję, wygląda to tak:
int main(int argc, char *argv[])
Kiedy koduję C ++ bez IDE, tylko z kompilatorem wiersza poleceń, piszę:
int main()
bez żadnych parametrów. Co to oznacza i czy ma to zasadnicze znaczenie dla mojego programu?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
źródło
źródło
int main(int argc, char* argv[], char* envp[])
i wydrukować ostatni argument.;)
system()
wywołań, zapytań DB itp. Jak zwykle przy wprowadzaniu danych przez użytkownika.char **envp
argumentu?Odpowiedzi:
argv
i wargc
jaki sposób przekazywane są argumenty wiersza poleceńmain()
w C i C ++.argc
będzie liczbą ciągów wskazanych przezargv
. Będzie to (w praktyce) 1 plus liczba argumentów, ponieważ praktycznie wszystkie implementacje dodają nazwę programu do tablicy.Zmienne są nazywane
argc
( liczba argumentów ) iargv
( wektor argumentów ) zgodnie z konwencją, ale można im nadać dowolny poprawny identyfikator:int main(int num_args, char** arg_strings)
jest równie ważny.Można je również całkowicie pominąć, dając wynik
int main()
, jeśli nie zamierzasz przetwarzać argumentów wiersza poleceń.Wypróbuj następujący program:
Uruchomienie go
./test a1 b2 c3
spowoduje wyjścieźródło
argc
może wynosić 0, w którym to przypadkuargv
może mieć wartość NULL. Jest to dozwolone przez standardowy AFAIK. Nigdy nie słyszałem o systemie, który robi to w praktyce, ale z pewnością mógłby istnieć i nie naruszałby żadnych standardów.argv[argc]
wynosi 0” (C ++ 03 §3.6.1 / 2),argv
nie może być zerowa.*NULL
zdecydowanie nie jest równyNULL
.argc
jest liczbą argumentów przekazywanych do twojego programu z linii poleceń iargv
jest tablicą argumentów.Możesz przeglądać argumenty, znając ich liczbę, np .:
źródło
Załóżmy, że uruchamiasz program w ten sposób (używając
sh
składni):Jeśli zadeklarowałeś swój główny jako
int main(int argc, char *argv[])
, to (w większości środowisk)main()
zostaniesz wywołany tak, jakby:Jeśli jednak zadeklarujesz swój główny jako
int main()
, będzie to nazywać coś w rodzajui nie dostaniesz argumentów.
Dwie dodatkowe rzeczy do zapamiętania:
main
. Jeśli dana platforma akceptuje dodatkowe argumenty lub inny typ zwrotu, to jest to rozszerzenie i nie należy na nim polegać w przenośnym programie.*argv[]
i**argv
są dokładnie równoważne, więc możesz pisaćint main(int argc, char *argv[])
jakoint main(int argc, char **argv)
.źródło
basic.start.main/2
wyraźnie zezwalamy na dodatkowe wersje zdefiniowanemain()
przez implementację, pod warunkiem, że implementacja zapewnia dwie predefiniowane wersje. Nie są więc dokładnie niezgodne. Najczęstszym z nich jestenvp
, który jest tak dobrze znana zarówno w C i C ++, który jest dosłownie pierwszy wpis w sekcji J.5 (wspólne rozszerzenia) standardu C .Parametry
main
reprezentujące parametry wiersza poleceń dostarczone programowi podczas jego uruchamiania.argc
Parametr reprezentuje liczbę argumentów wiersza poleceń, achar *argv[]
jest tablicą ciągów znaków (wskaźniki) reprezentujących poszczególne argumenty podane w wierszu poleceń.źródło
argv[0]
to bez względu na program rozpoczyna program C dał ją jakoargv[0]
. W przypadku Bash często jest to (może zawsze) nazwa pliku wykonywalnego, ale Bash nie jest jedynym programem, który wykonuje inne programy. Jest permissisble, choć ekscentryczny, aby użyć:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. W wielu systemach wartość jest postrzegana przez program jakoargv[0]
takacat
, mimo że jest to plik wykonywalny/bin/ls
.main
Funkcja może mieć dwa parametry,argc
iargv
.argc
jestint
parametrem liczby całkowitej ( ) i jest liczbą argumentów przekazanych do programu.Nazwa programu jest zawsze pierwszym argumentem, więc program będzie miał co najmniej jeden argument, a minimalna wartość
argc
będzie wynosić jeden. Ale jeśli program ma dwa argumenty, wartośćargc
będzie równa trzy.Parametr
argv
wskazuje na tablicę łańcuchów i jest nazywany wektorem argumentów . Jest to jednowymiarowa tablica ciągów argumentów funkcji.źródło
To prosta deklaracja. Nie może przyjmować żadnych argumentów wiersza poleceń.
Ta deklaracja jest używana, gdy program musi przyjmować argumenty wiersza polecenia. Po uruchomieniu tak:
argc
lub Liczba argumentów zostanie ustawiona na 4 (cztery argumenty) iargv
lub Wektory argumentów zostaną wypełnione wskaźnikami łańcuchowymi do „myprogram”, „arg1”, „arg2” i „arg3”. Wywołanie programu (myprogram
) jest zawarte w argumentach!Alternatywnie możesz użyć:
Jest to również ważne.
Istnieje jeszcze jeden parametr, który możesz dodać:
Ten
envp
parametr zawiera również zmienne środowiskowe. Każdy wpis ma ten format:lubię to:
Lista zmiennych środowiskowych jest zakończona zerem.
WAŻNE: Nie należy stosować żadnych
argv
lubenvp
wartości bezpośrednio w wywołańsystem()
! Jest to ogromna dziura w zabezpieczeniach, ponieważ złośliwi użytkownicy mogą ustawiać zmienne środowiskowe na polecenia wiersza poleceń i (potencjalnie) powodować ogromne szkody. Ogólnie po prostu nie używajsystem()
. Prawie zawsze istnieje lepsze rozwiązanie zaimplementowane w bibliotekach C.źródło
Pierwszy parametr to liczba dostarczonych argumentów, a drugi parametr to lista ciągów reprezentujących te argumenty.
źródło
Obydwa
są prawnymi definicjami punktu wejścia dla programu C lub C ++. Stroustrup: Często zadawane pytania dotyczące stylu i techniki C ++ wyszczególniają niektóre warianty, które są możliwe lub legalne dla twojej głównej funkcji.
źródło
int main()
==>int main(void)
... dla kompatybilności i czytelności. Nie wiem, czy wszystkie starsze wersje C zezwalają, aby funkcje void miały pustą listę parametrów w deklaracji.void
jest to wymagane. Nie cytuj mnie w tej sprawie, a teraz wiem, że to nieco głupi komentarz. Ale to nie może zranić.