====== 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]]).