Cpp argv argc char

Cpp argv argc char

В прошлых темах функция main определялась без параметров. Однако также можно определить данную функцию с параметрами:

int main(int argc, char* argv[]) < // инструкции >

Первый параметр, argc , представляет тип int и хранит количество аргументов командной строки. Второй параметр, argv[] , представляет собой массив указателей и хранит все переданные аргументы командной строки в виде строк. Таким образом, благодаря данным параметрам мы можем при вызове программы в консоли передать ей некоторые данные.

Например, определим следующую программу:

#include int main(int argc, char* argv[]) < // выводим все переданные аргументы в цикле for (int i <>; i < argc; ++i) < std::cout >

В данном случае просто выводим все аргументы командной строки на консоль. Скомпилируем и просто запустим программу, не передавая ей никаких аргументов:

c:\cpp>g++ hello.cpp -o hello & hello hello

В моем случае код программы расположен в файле «hello.cpp» и компилируется в файл с именем hello. После запуска программы, даже если мы не передаем ей никакх аргументов, в массиве argv[] будет как минимум один элемент — название файла программы. То есть в моем случае в массиве будет одна строка «hello». А первый параметр, argc , будет равен 1.

Передадим программе какие-нибудь аргументы

c:\cpp>g++ hello.cpp -o hello & hello Tom 38 hello Tom 38

Здесь программе при запуске передается два значения — «Tom» и «38». Передаваемые аргументы разделяются пробелом. Причем даже если передается число (как в случае с вторым аргументом), то программа все равно получает его в виде строки. Соответственно теперь в массиве argv будет три элемента.

Источник

main аргументы функции и командной строки

Все программы C++ должны иметь функцию main . При попытке скомпилировать программу C++ без main функции компилятор выдает ошибку. (Библиотеки и static библиотеки динамической main компоновки не имеют функции.) Функция main — это место, где начинается выполнение исходного кода, но перед тем, как программа войдет в функцию main , все static члены класса без явных инициализаторов задаются равным нулю. В Microsoft C++ глобальные static объекты также инициализируются перед записью в main . К функции применяются некоторые main ограничения, которые не применяются к другим функциям C++. Функция main :

  • Не удается перегрузить (см. раздел Перегрузка функций).
  • Не может быть объявлен как inline .
  • Не может быть объявлен как static .
  • Не может быть принято его адрес.
  • Не удается вызвать из программы.

Сигнатура main функции

Функция main не имеет объявления, так как она встроена в язык. Если это так, синтаксис объявления для main будет выглядеть следующим образом:

int main(); int main(int argc, char *argv[]); 

Если возвращаемое значение не указано в main , компилятор предоставляет возвращаемое значение, равное нулю.

Читайте также:  Php browser session cookie headers already sent by

Стандартные аргументы командной строки

Аргументы для main обеспечивают удобный анализ аргументов из командной строки. Типы для параметров argc и argv определяются языком. Имена argc и argv являются традиционными, но вы можете назвать их как угодно.

Используются следующие определения аргументов.

argc
Целое число, содержащее количество аргументов, следующих в argv. Параметр argc всегда больше или равен 1.

argv
Массив завершающихся null строк, представляющих введенные пользователем программы аргументы командной строки. По соглашению — это команда, argv[0] с помощью которой вызывается программа. argv[1] — первый аргумент командной строки. Последний аргумент из командной строки — argv[argc — 1] , и argv[argc] всегда имеет значение NULL.

Сведения о том, как отключить обработку из командной строки, см. в разделе Настройка обработки командной строки C++.

По соглашению argv[0] — это имя файла программы. Однако в Windows можно создать процесс с помощью CreateProcess . При использовании первого и второго аргументов ( lpApplicationName и lpCommandLine ), argv[0] возможно, не является именем исполняемого файла. Вы можете использовать для GetModuleFileName получения имени исполняемого файла и его полного пути.

Расширения, относящиеся к корпорации Майкрософт

В следующих разделах описывается поведение, зависят от майкрософт.

Функция wmain и _tmain макрос

Если вы разрабатываете исходный код для использования расширенных действий Юникода char, вы можете использовать точку входа, относяющуюся к Корпорации wmain Майкрософт, которая является версией для широкогоchar действия main . Ниже приведен действующий синтаксис объявления для wmain :

int wmain(); int wmain(int argc, wchar_t *argv[]); 

Можно также использовать зависящий от _tmain Майкрософт макрос, который является макросом препроцессора, определенным в tchar.h . _tmain разрешается в , main если _UNICODE не задано значение . В противном случае функция _tmain разрешается в функцию wmain . Макрос _tmain и другие макросы, которые начинаются с _t , полезны для кода, который должен создавать отдельные версии как для узких, так и для широких charнаборов действий. Дополнительные сведения см. в разделе Использование сопоставлений универсального текста.

Возврат из void main

Как расширение Майкрософт функции main и wmain могут быть объявлены как возвращающие (без возвращаемого void значения). Это расширение также доступно в некоторых других компиляторах, но его использование не рекомендуется. Он доступен для симметрии, если main не возвращает значение.

Если вы объявите main или wmain как возвращающий void , вы не сможете вернуть exit код родительскому процессу или операционной системе с помощью инструкции return . Чтобы вернуть exit код, если main или wmain объявлен как void , необходимо использовать функцию exit .

Аргумент envp командной строки

Сигнатуры main или wmain позволяют дополнительному расширению майкрософт для доступа к переменным среды. Это расширение также распространено в других компиляторах для систем Windows и UNIX. Это традиционное имя envp , но параметру среды можно присвоить любое имя. Ниже приведены действующие объявления для списков аргументов, включающих параметр среды:

int main(int argc, char* argv[], char* envp[]); int wmain(int argc, wchar_t* argv[], wchar_t* envp[]); 

envp
Необязательный envp параметр представляет собой массив строк, представляющих переменные, заданные в среде пользователя. Этот массив завершается записью NULL. Его можно объявить как массив указателей на char () или как указатель на ( char char **envp ). char *envp[] Если программа использует wmain вместо main , используйте wchar_t тип данных вместо char .

Читайте также:  Вывод в шаблон данных php

Блок среды, передаваемый main в и wmain , является «замороженной» копией текущей среды. Если позже вы измените среду путем вызова putenv или _wputenv , текущая среда (возвращенная getenv или _wgetenv и _environ переменная или _wenviron ) изменится, но блок, на который envp указывает , не изменится. Дополнительные сведения о том, как отключить обработку среды, см. в разделе Настройка обработки командной строки C++. Аргумент envp совместим со стандартом C89, но не со стандартами C++.

Примеры аргументов для main

В следующем примере показано, как использовать argc аргументы , argv и envp для main :

// argument_definitions.cpp // compile with: /EHsc #include #include using namespace std; int main( int argc, char *argv[], char *envp[] ) < bool numberLines = false; // Default is no line numbers. // If /n is passed to the .exe, display numbered listing // of environment variables. if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 ) numberLines = true; // Walk through list of strings until a NULL is encountered. for ( int i = 0; envp[i] != NULL; ++i ) < if ( numberLines ) cout > 

Анализ аргументов командной строки C++

Правила анализа командной строки, используемые кодом Microsoft C/C++, зависят от корпорации Майкрософт. Код запуска среды выполнения использует следующие правила при интерпретации аргументов, заданных в командной строке операционной системы:

  • Аргументы разделяются пробелами (пробел или табуляция).
  • Первый аргумент ( argv[0] ) обрабатывается особым образом. Он представляет имя программы. Это должен быть допустимый путь, поэтому разрешены части, заключенные в двойные кавычки ( « ). Эти знаки двойных кавычек не включаются в выходные данные argv[0] . Части, заключенные в двойные кавычки, предотвращают интерпретацию пробела или табуляции charв качестве конца аргумента. Последующие правила в этом списке не применяются.
  • Строка, заключенная в двойные кавычки, интерпретируется как один аргумент, который может содержать charпробелы. Строку в кавычках можно встроить в аргумент. Курсор ( ^ ) не распознается как escape-действие charили разделитель. Внутри заключенной в кавычки строки пара двойных кавычек интерпретируется как одна экранированная двойная кавычка. Если командная строка заканчивается до того, как будет найдена закрывающая двойная кавычка, то в качестве последнего аргумента выводятся все charсчитанные до сих пор действия.
  • Символ двойной кавычки после обратной косой черты ( ) интерпретируется как литеральный символ двойной кавычки ( « ).
  • Символы обратной косой черты считаются литералами, если сразу за ними не стоит двойная кавычка.
  • Если двойная кавычка стоит после четного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ), а сама двойная кавычка ( « ) интерпретируется как разделитель строк.
  • Если двойная кавычка стоит после нечетного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ). Двойная кавычка интерпретируется обратной косой чертой remaining как escape-последовательность, в результате чего литерал двойной кавычки ( « ) помещается в argv .
Читайте также:  Javascript getelementbyid style left

Пример анализа аргументов командной строки

В следующем примере программы показана передача аргументов командной строки:

// command_line_arguments.cpp // compile with: /EHsc #include using namespace std; int main( int argc, // Number of strings in array argv char *argv[], // Array of command-line argument strings char *envp[] ) // Array of environment variable strings < int count; // Display each command-line argument. cout

Результаты анализа командных строк

В следующей таблице показаны примеры входных данных и ожидаемые выходные данные, иллюстрирующие применение правил из приведенного выше списка.

Входные данные в командной строке argv[1] argv[2] argv[3]
"abc" d e abc d e
a\\b d"e f"g h a\\b de fg h
a\\\"b c d a\"b c d
a\\\\"b c" d e a\\b c d e
a"b"" c d ab" c d

Развертывание подстановочных знаков

Компилятор Майкрософт при необходимости позволяет использовать подстановочные знакиchar, вопросительный знак ( ? ) и звездочку ( * ), чтобы указать аргументы имени файла и пути в командной строке.

Аргументы командной строки обрабатываются внутренней подпрограммой в коде запуска среды выполнения, которая по умолчанию не расширяет подстановочные знаки на отдельные строки в строковом массиве argv . Вы можете включить расширение с подстановочными знаками, включив setargv.obj файл ( wsetargv.obj файл для wmain ) в /link параметры компилятора или в командной строке LINK .

Дополнительные сведения о параметрах компоновщика для запуска среды выполнения см. в статье Параметры ссылок.

Настройка обработки из командной строки C++

Если программа не принимает аргументы командной строки, можно сохранить небольшой объем пространства, подавив подпрограмму обработки командной строки. Для этого включите файл noarg.obj (для main и wmain ) в параметры компилятора /link или командную строку LINK .

Аналогичным образом, если вы никогда не использовали таблицу среды для доступа к аргументу envp , можно подавить внутреннюю подпрограмму обработки среды. Для этого включите файл noenv.obj (для main и wmain ) в параметры компилятора /link или командную строку LINK .

Программа может вызывать семейство подпрограмм spawn или exec в библиотеке среды выполнения C. В этом случае не следует подавлять подпрограмму обработки среды, так как она используется для передачи данных о среде из родительского процесса в дочерний.

Источник

Оцените статью