Что означают int argc, char *argv[]?
В многих IDE для C++ и компиляторах, когда они генерируют функцию main, она выглядит следующим образом:
int main(int argc, char *argv[])
Когда я программирую на C++ без использования IDE, просто через командную строку, я пишу:
int main()
без каких-либо параметров. Что это означает, и насколько это важно для моей программы?
5 ответ(ов)
argv
и argc
— это параметры, с помощью которых аргументы командной строки передаются в main()
в C и C++.
argc
представляет собой количество строк, на которые указывает argv
. На практике это будет на единицу больше, чем количество аргументов, так как практически все реализации добавляют имя программы в начало массива.
Переменные названы argc
(количество аргументов) и argv
(вектор аргументов) по соглашению, но им можно дать любое допустимое имя идентификатора: int main(int num_args, char** arg_strings)
также будет корректным.
Их также можно полностью опустить, используя int main()
, если нет необходимости обрабатывать аргументы командной строки.
Попробуйте следующий код:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:\n";
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << "\n";
}
}
При запуске программы с аргументами ./test a1 b2 c3
, вывод будет следующим:
Have 4 arguments:
./test
a1
b2
c3
Этот пример демонстрирует, как вы можете получить доступ к аргументам командной строки и использовать их в своей программе.
argc
— это количество аргументов, переданных вашей программе из командной строки, а argv
— это массив аргументов.
Вы можете перебрать аргументы, зная их количество, следующим образом:
for(int i = 0; i < argc; i++)
{
// argv[i] — это аргумент на индексе i
}
Таким образом, вы можете получить доступ к каждому аргументу по его индексу, что позволяет обрабатывать их по мере необходимости.
Если вы запускаете свою программу следующим образом (с использованием синтаксиса sh
):
myprog arg1 arg2 'arg 3'
Если вы объявили main
как int main(int argc, char *argv[])
, то (в большинстве сред) ваша main()
будет вызвана так:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
Однако, если вы объявили main
как int main()
, она будет вызвана как-то так:
exit(main());
В этом случае аргументы не будут переданы.
Два дополнительных момента, которые стоит отметить:
- Это единственные две стандартные сигнатуры для
main
. Если конкретная платформа принимает дополнительные аргументы или другой тип возвращаемого значения, то это является расширением и не должно использоваться в портируемой программе. *argv[]
и**argv
абсолютно эквивалентны, поэтому вы можете записатьint main(int argc, char *argv[])
какint main(int argc, char **argv)
.
Конечно! Вот перевод на русский в стиле ответа на StackOverflow.com:
int main();
Это простая декларация функции main
. Она не принимает аргументы командной строки.
int main(int argc, char* argv[]);
Эта декларация используется, когда вашей программе необходимо принимать аргументы командной строки. Когда программа запускается следующим образом:
myprogram arg1 arg2 arg3
argc
, или количество аргументов, будет установлено в 4 (четыре аргумента), а argv
, или массив аргументов, будет заполнен указателями на строки "myprogram", "arg1", "arg2" и "arg3". Запуск программы (myprogram
) также включается в аргументы!
В качестве альтернативы, вы можете использовать:
int main(int argc, char** argv);
Это также является допустимым вариантом.
Существует еще один параметр, который вы можете добавить:
int main(int argc, char* argv[], char* envp[]);
Параметр envp
также содержит переменные окружения. Каждая запись имеет следующий формат:
VARIABLENAME=VariableValue
например:
SHELL=/bin/bash
Список переменных окружения завершается нулем.
ВАЖНО: НИКОГДА не используйте значения argv
или envp
напрямую в вызовах к system()
! Это огромная уязвимость безопасности, так как злоумышленники могут установить переменные окружения на команды командной строки и (возможно) причинить значительный ущерб. В общем, просто не используйте system()
. Почти всегда существует более подходящее решение через стандартные библиотеки C.
Параметры функции main
представляют собой аргументы командной строки, переданные программе при её запуске. Параметр argc
обозначает количество аргументов командной строки, а char *argv[]
— это массив строк (указателей на символы), представляющий собой отдельные аргументы, переданные в командной строке.
Влияет ли использование const на параметры функции? Почему это не сказывается на сигнатуре функции?
Что такое Правило трёх?
Разница между const int*, const int * const и int * const?
Имеют ли круглые скобки после имени типа значение при использовании new?
`unsigned int` против `size_t`: когда и что использовать?