====== Funkce main ======
Funkce main představuje tzv. **vstupní bod programu** - funkce, která se při spuštění programu **vykonává jako první**. Ukončením funkce main se ukončí i celá aplikace. Pokud není funkce main ve fázi linkování aplikace přítomna (viz [[ccpp:kompilace|ccpp:kompilace]]), skončí tento proces s chybou a spustitelná aplikace nebude vytvořena.
===== Ukázka minimální funkce main =====
int main()
{
return 0; // indikujeme EXIT_SUCCESS pro OS
}
Pokud chceme aby byla aplikace plně korektní měla by funkce //main// končit voláním příkazu //return// s parametrem //0// v případě bezchybného konce aplikace, a nebo nenulovou hodnotou v případě chyby. Vrácené číslo je pak předáno operačnímu systému, který ho interpretuje jako chybu a lze s ním dále pracovat (výhodné pro skripty). Pokud příkaz return v moderních implementacích vynecháme, je automaticky předána hodnota 0.
Poznámka: **Volání příkazu return okamžitě ukončí celou funkci a v případě funkce main i celou aplikaci.**
==== Ukázka signalizace chyby ====
int main(int argc, char* argv[])
{
int x;
printf("Zadejte odpoved na zakladni otazku zivota, vesmiru a vubec\n");
scanf("%d", &x);
if (x != 42)
return 1; // chybove ukonceni aplikace
return 0;
}
===== Úplná funkce main s argumenty aplikace =====
Každé aplikaci lze při jejím spuštěním zadat argumenty. Tyto argumenty jsou pak předány do speciálních parametrů funkce main jako vektor (seznam) řetězců. Parametr //argc// představuje počet argumentů, parametr //argv[]// je pole řetězců obsahující samotné argumenty. Každá aplikace dostane při spuštění automaticky alespoň jeden argument - její název.
==== Ukázka předávání argumentů ====
$ ./mojeAplikace argument1 argument2
==== Ukázka apliakce, která vypíše všechny argumenty ====
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; ++i)
{
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
===== Vícevláknové aplikace =====
Funkce main běží v hlavním vlákně aplikace. Pokud dojde k ukončení funkce main, jsou ukončena i všecha ostatní vlákna. Jestliže chceme počkat na dokončení ostatních vláken, je třeba na každé z nich počkat využítím funkce //thread::join// (C++11; [[https://en.cppreference.com/w/cpp/thread/thread/join|cpp reference]]), nebo //pthread_join// (POSIX; [[http://man7.org/linux/man-pages/man3/pthread_join.3.html|man stránka]]).