Функция main и код возврата
Программу часто запускает не человек, а другая программа — например, скрипт или система проверки задач. Ей нужно узнать, удачно ли закончилась работа, а разбирать для этого вывод неудобно. Поэтому main возвращает число:
#include <iostream>
int main() {
std::cout << "Done\n"; // Done
return 0;
}Код возврата
int перед main — тип результата: функция возвращает целое число. Инструкция return 0; завершает main, и 0 становится кодом возврата (exit code) программы. Его получает тот, кто программу запустил. По соглашению 0 означает успех, а любое другое число — сбой.
Код возврата не попадает в вывод: return 0; ничего не печатает. В терминале Linux или macOS его показывает команда echo $?.
return срабатывает сразу: инструкции, которые стоят в main после него, уже не выполняются.
Выход без return
Из функций, которые возвращают значение, только main может обойтись без return. Если выполнение дошло до закрывающей скобки main, программа возвращает 0, как после return 0;. Так работает программа с Hello, world: return в ней нет, а код возврата — 0. Поэтому return 0; в конце main часто не пишут.
В любой другой функции, которая возвращает значение, такой выход — неопределённое поведение (undefined behavior): стандарт C++ не говорит, что тогда произойдёт. Компилятор при этом выдаёт предупреждение.
Аргументы командной строки
Стандарт C++ гарантирует две формы main: int main() и int main(int argc, char* argv[]). Вторая получает слова команды, которой программу запустили, — аргументы командной строки (command-line arguments). argc — число слов, а argv — сами слова; первое из них лежит в argv[0].
#include <iostream>
int main(int argc, char* argv[]) {
std::cout << argc << ' ' << argv[0] << '\n'; // 1 ./args
}Эту программу запустили из терминала командой ./args. Слово в команде одно — имя программы, поэтому argc равен 1. Команда ./args red blue даст 3 ./args.
Частая ошибка
Здесь перед main стоит void — «нет результата» — вместо int:
#include <iostream>
void main() { // ✗
std::cout << "Done\n";
}error: 'main' must return 'int'Стандарт C++ требует, чтобы main возвращала int, поэтому clang и GCC такую программу не компилируют.