Argc argv c что это
Перейти к содержимому

Argc argv c что это

  • автор:

__argc , __argv , __wargv

Глобальная переменная __argc — это счетчик числа аргументов командной строки, переданных программе. __argv — указатель на массив одно- или многобайтовых строк, который содержит аргументы программы, а __wargv — указатель на массив строк расширенных символов, который содержит аргументы программы. Эти глобальные переменные обеспечивают аргументы для main или wmain .

Синтаксис

extern int __argc; extern char ** __argv; extern wchar_t ** __wargv; 

Замечания

В программе, которая использует main функцию, __argc инициализируется __argv при запуске программы с помощью командной строки, которая используется для запуска программы. Командная строка разбирается на отдельные аргументы, а подстановочные знаки разворачиваются. Число аргументов назначается функции __argc , строки аргументов выделяются в куче, а указатель на массив аргументов назначается __argv . В программе, которая скомпилирована для использования расширенных символов и функции wmain , аргументы анализируются и подстановочные знаки разворачиваются как строки расширенных символов, а указатель на массив строк аргументов назначается __wargv .

Для создания переносимого кода рекомендуется использовать аргументы, переданные в main , чтобы получить аргументы командной строки в программе.

Сопоставления подпрограмм универсального текста

Подпрограмма Tchar.h _UNICODE не определен _UNICODE Определенные
__targv __argv __wargv

Требования

Глобальная переменная Обязательный заголовок
__argc , __argv , __wargv , (C++)

__argc , __argv и __wargv являются расширениями Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.

Параметры функции main (argc, argv)

При создании консольного приложения в языке программирования С++, автоматически создается строка очень похожая на эту:

int main(int argc, char* argv[]) // параметры функции main()

Эта строка — заголовок главной функции main() , в скобочках объявлены параметры argс и argv. Так вот, если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе, для этого и существуют параметры argc и argv[] . Параметр argc имеет тип данных int , и содержит количество параметров, передаваемых в функцию main . Причем argc всегда не меньше 1, даже когда мы не передаем никакой информации, так как первым параметром считается имя функции. Параметр argv[] это массив указателей на строки. Через командную строку можно передать только данные строкового типа. Указатели и строки — это две большие темы, под которые созданы отдельные разделы. Так вот именно через параметр argv[] и передается какая-либо информация. Разработаем программу, которую будем запускать через командную строку Windows, и передавать ей некоторую информацию.

// argc_argv.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < if (argc >1)// если передаем аргументы, то argc будет больше 1(в зависимости от кол-ва аргументов) < cout else < cout system("pause"); return 0; >
// argc_argv.cpp: определяет точку входа для консольного приложения. #include using namespace std; int main(int argc, char* argv[]) < if (argc >1)// если передаем аргументы, то argc будет больше 1(в зависимости от кол-ва аргументов) < cout else < cout return 0; >

После того как отладили программу, открываем командную строку Windows и перетаскиваем в окно командной строки экзэшник нашей программы, в командной строке отобразится полный путь к программе(но можно прописать путь к программе в ручную), после этого можно нажимать ENTER и программа запустится (см. Рисунок 1).

Аргументы функции main()

Рисунок 1 — Параметры функции main

Так как мы просто запустили программу и не передавали ей никаких аргументов, появилось сообщение Not arguments . На рисунке 2 изображён запуск этой же программы через командную строку, но уже с передачей ей аргумента Open .

Аргументы функции main()

Рисунок 2 — Параметры функции main

Аргументом является слово Open , как видно из рисунка, это слово появилось на экране. Передавать можно несколько параметров сразу, отделяя их между собой запятой. Если необходимо передать параметр состоящий из нескольких слов, то их необходимо взять в двойные кавычки, и тогда эти слова будут считаться как один параметр. Например, на рисунке изображен запуск программы, с передачей ей аргумента, состоящего из двух слов — It work .

Аргументы функции main()

Рисунок 3 — Параметры функции main

А если убрать кавычки. То увидим только слово It . Если не планируется передавать какую-либо информацию при запуске программы, то можно удалить аргументы в функции main() , также можно менять имена данных аргументов. Иногда встречается модификации параметров argc и argv[] , но это все зависит от типа создаваемого приложения или от среды разработки.

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Что такое argc, char * argv[] в Си

В Си все функции в исполняемом файле вызываются из функции main ().

Функция main () тоже должна быть вызвана. Например, из bash .

Вызов может быть как без аргументов, так и с аргументами.

Начнём с первого варианта

Вызов без аргументов

Если Вы не собираетесь использовать аргументы командной строки, то можно писать int main ()

Что вообще под этим имеется в виду:

Рассмотрим простейшую программу, которую мы написали в файле hello_world.c

#include int main ( int argc, char * argv[])

Предположим, что мы скомпилировали наш hello_world.c в object файл hello_world командой

gcc -o hello_world hello_world.c

И теперь выполняем

Нам совершенно не важно написано

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

просто int main ()

В какой момент это станет важным?

— В тот момент когда нужно будет вызывать с аргументами

Вызов с аргументами

argc — argument count — это количество аргументов командной строки.

Тип argc — int

Минимально значение argc это 1. argv[0] это имя программного файла (в нашем случае программный файл это hello_world.c).

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

char * — это тип возвращаемого значени

argv[] — argument vector — массив значений этих аргументов

Рассмотрим другую программу, написанную в файле example.c

Она будет ожидать два аргумента типа int .

В коде они будут называться a1 и a2. Обратите внимание на седьмую и восьмую строки.

#include #include int main ( int argc, char * argv[])

Скомпилируйте этот код командой

gcc -o example example.c

Осталось вызвать программу и передать при вызове аргументы прямо в командной строке.

File name = ./example
7 9

Мы вызываем example и прямо в командной строке передаём два аргумента.

Сперва мы убедились что argv[0] это действительно имя файла. Затем увидели переданные аргументы

Теперь, если Вы захотите убрать int argc, char * argv[] из main

Компилятор Вас не поймёт и пожалуется на необъявленные argv

example.c: In function ‘main’: example.c:7:16: error: ‘argv’ undeclared (first use in this function) int a0=atoi(argv[0]); ^~~~ example.c:7:16: note: each undeclared identifier is reported only once for each function it appears in

Если убрать все упоминания о аргументах командной строки из кода и попробовать запустить программу с аргументами — они буду проигнорированы.

gcc -o example example.c
./example 7 9

В других языках

В Python аналогичную функцию выполняет sys.argv

Для чего в main (int argc, char *argv[])

Недавно начал изучать C++ и не понимаю зачем принимать 2 аргумента? Один — целое число, а второй — массив, ещё и память выделяется как-то странно без new . Откуда приходят эти аргументы и зачем их используют?

Отслеживать
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
задан 10 июн 2013 в 19:10
Павел Дурa Павел Дурa
1,421 3 3 золотых знака 21 21 серебряный знак 43 43 бронзовых знака

К уже данным ответам могу только посоветовать для более глубокого понимания почитать man 3 exec и маны из SEE ALSO в нем. Возможно, кроме них представляют интерес man system и man popen . — Кстати, в общем случае в main передается не 2, а 3 аргумента (3-ий массив адресов переменных окружения (environment), завершающийся нулем. Он аналогичен второму, в котором передаются адреса аргументов командной строки) int main (int ac, char **av, char **env);

10 июн 2013 в 20:09

далеко не факт, что у человека линукс. да и третий параметр — это компиляторозависимое, хотя многие поддерживают это. В принципе, никто ведь не мешал разработчикам сделать что то вида int main(std::vector argv) < return 0; >Но что то не спешат.

10 июн 2013 в 20:23

@KoVadim, не знаю, какие компиляторы как, а g++ в винде замечательно все это поддерживает: c:/Users/avp/src/cc/hashcode $ g++ 3args.cpp c:/Users/avp/src/cc/hashcode $ ./a a1 a2 arg av[0]: c:\Users\avp\src\cc\hashcode\a.exe av[1]: a1 av[2]: a2 env env[0]: ALLUSERSPROFILE=C:\ProgramData env[1]: APPDATA=C:\Users\avp\AppData\Roaming . env[53]: windows_tracing_flags=3 env[54]: windows_tracing_logfile=C:\BVTBin\Tests\installpackage\csilogfile.log c:/Users/avp/src/cc/hashcode $ — Да и execl(«a.exe», «xaxa», 0); тоже работает.

10 июн 2013 в 21:13
да уж, @KoVadim с линуксом явно погорячился ))
11 июн 2013 в 5:27
9 ноя 2022 в 8:11

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Это параметры командной строки, которые могут быть переданы Вашему приложению. Первый аргумент передается по той причине, что встроенные массивы в С/С++ не хранят размер и передача размера — один из способов об этом узнать (можно к примеру договориться, что последний элемент будет нулевым, но это накладывает определенные ограничения).

память выделяется как-то странно без new

память выделяется в другом месте, а в функцию приходит только указатель. Как именно она там выделяется — в данный момент Вас тревожить не должно. Главное помнить правило — «кто память выделяет, тот обычно ее и удаляет». В данном случае компилятор вставит весь необходимый код, который выделит память и освободит. Хотя там ещё и система немного может выделить.

Как же приходят аргументы?

К примеру, Вы можете запустить программу так

myprog param1 param2 param3 

в этом случае argc будет иметь значение 4. argv[1] будет равно param1. argv[3] будет равно param3. Возникает вопрос, а что в нулевом элементе? а там имя программы в том виде, в котором его предоставляет операционная система. То есть, там может быть как myprog, так и имя с полным путем.

  • Аргументы функции main(): argv и argc
  • Параметры функции main (argc, argv)

upd: для любителей стандарта — читать пункт 3.6.1. Там в частности сказано, что официально есть два варианта — int main() и int main(int argc, char *argv[]) (хотя последний можно записать как int main(int argc, char **argv) — суть не меняется). Все остальное — на усмотрение компиляторов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *