Функция main. Аргументы и возвращаемое значение

Главная Форумы Программирование Программирование на С++ Учебные материалы по С++ Функция main. Аргументы и возвращаемое значение

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 2 мес. назад.

  • Автор
    Сообщения
  • #2975

    questioner
    Участник

    У функции main() в языке С++ есть два аргумента – argc и argv, кроме того она возвращает целое число. Почему в качестве возвращаемого значения обычно используют ноль, но часто вообще ничего не возвращают (и компилятор не ругается)? Зачем все это нужно и почему часто эту функцию используют без аргументов?

  • #2986

    Аргументы функции main используются для передачи данных в приложение через командную строку или от других приложений. Эту технологию используют все системные утилиты в любой операционной системе, а также, например, инструменты программиста (компилятор, отладчик, компоновщик и т.п.). Чтобы скомпилировать файл main.cpp – вы можете написать:
    g++ main.cpp -o main
    При этом запустится программа g++Windows g++.exe) и ей на вход будет передано три аргумента – "main.cpp", "-o", "main". Программа анализирует не только сами аргументы, но и их порядок.

    Итак, у функции main() может быть два аргумента – первый отвечает за количество полученных параметров (обычно называют argc), а второй представляет собой массив параметров (argv). Вне значения, переданные в программу, внутри рассматриваются как символьные строки – тип argvchar*[argc+1].

    Даже если не передавать программе никаких значений – argc будет равен единице, т.к. argv[0] всегда содержит имя запущенной программы. Последний элемент массива параметров (argv[argc]) всегда равен нулю – это может использоваться при переборе параметров.

    Часто делают так, что при запуске программы без аргументов она начинает диалог с пользователем, но если аргументы переданы – то использует их (не задает лишних вопросов):

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(int argc, char* argv[]) {
      string in_filename;
      ifstream ifst;
      
      if (argc < 2) {
        cout << "input file name: ";
        cin >> in_filename;
      } 
      else {
        in_filename = argv[1];
      }
      
      ifst.open(in_filename);
      int data;
      
      ifst >> data;
      cout << data;
    }

    Приведенная программа выводит на экран первое число из файла. При этом если имя файла передается в качестве аргумента, но если аргумент не задан – программа спросит требуемое имя у пользователя во время работы:

    main_arguments_example

    На снимке экрана используется стандартная в UNIX команда cat, выводящая на экран содержимое файла.

    Многие утилиты требуют определенное количество входных аргументов, например если приложение на вход всегда должно принимать входной и выходной файл – программа может для начала проверить количество параметров:

    int main(int argc, char* argv[]) {
      enum ERRORS {
        NO_ERROR,
        BAD_ARGUMENTS_NUMBER
      };
      
      if (argc < 2) 
        return BAD_ARGUMENTS_NUMBER;
      // ...

    Программа может перебирать аргументы как элементы массива, однако зачастую пользователь передает в качестве значений числа – преобразовать строку в число можно, например, с помощью sscanf или std::stringstream.

    В последнем примере функция main() возвращает значение. Значением всегда является целое число, которое обрабатывается операционной системой – процесс, завершающийся с кодом ноль отработал без ошибок, во всех остальных случаях операционная система знает что произошла какая-то ошибка (при этом значения могут быть любыми, на них нет никакого стандарта). Нулевое значение функция main() вернет автоматически (при нормальном завершении программы) – это зафиксировано стандартом языка, все остальные значения рекомендуется именовать при помощи констант или перечислений (enum).

Для ответа в этой теме необходимо авторизоваться.