Во многих C ++ IDE и компиляторах, когда он генерирует основную функцию для вас, это выглядит так:
int main(int argc, char *argv[])
Когда я кодирую C ++ без IDE, просто с помощью компилятора командной строки, я набираю:
int main()
без каких-либо параметров. Что это значит и важно ли это для моей программы?
c++
parameters
command-line-arguments
argv
argc
Грег Трелевен
источник
источник
int main(int argc, char* argv[], char* envp[])
и распечатать последний аргумент.;)
system()
вызовам, запросам в БД и т. Д. Как обычно, при вводе пользователем.char **envp
аргумента?Ответы:
argv
иargc
как аргументы командной строки передаютсяmain()
в C и C ++.argc
будет количество строк, на которые указываетargv
. Это (на практике) будет 1 плюс количество аргументов, так как практически все реализации будут добавлять имя программы к массиву.Переменные именуются
argc
( количество аргументов ) иargv
( вектор аргументов ) по соглашению, но им может быть присвоен любой допустимый идентификатор:int main(int num_args, char** arg_strings)
одинаково действителен.Они также могут быть полностью опущены,
int main()
если вы не собираетесь обрабатывать аргументы командной строки.Попробуйте следующую программу:
Запуск с
./test a1 b2 c3
выводомисточник
argc
может быть 0, в этом случаеargv
может быть NULL. Это разрешено стандартом AFAIK. Я никогда не слышал о системе, которая делает это на практике, но она, безусловно, может существовать и не будет нарушать какие-либо стандарты.argv[argc]
должно быть 0» (C ++ 03 §3.6.1 / 2),argv
не может быть нулевым.*NULL
точно не равноNULL
.argc
это число аргументов, передаваемых в вашу программу из командной строки, иargv
это массив аргументов.Вы можете перебирать аргументы, зная их количество, например:
источник
Предположим, что вы запускаете свою программу таким образом (используя
sh
синтаксис):Если вы объявили ваш main как
int main(int argc, char *argv[])
, то (в большинстве сред) вашmain()
вызов будет выглядеть так:Однако, если вы объявили свой главный как
int main()
, он будет называться что-то вродеи вы не получите аргументы переданы.
Еще две вещи, на которые стоит обратить внимание:
main
. Если конкретная платформа принимает дополнительные аргументы или другой тип возвращаемого значения, то это расширение и на него нельзя полагаться в переносимой программе.*argv[]
и**argv
в точности эквивалентны, так что вы можете написатьint main(int argc, char *argv[])
какint main(int argc, char **argv)
.источник
basic.start.main/2
явно разрешаем определенные реализацией дополнительные версииmain()
, при условии, что реализация предоставляет две предопределенные версии. Таким образом, они не совсем не соответствуют. Наиболее распространенным из них являетсяenvp
, что так хорошо известны как в C и C ++ , что это буквально очень первая запись в разделе J.5 (общие расширения) стандарта C .Параметры для
main
представления параметров командной строки, предоставленных программе при ее запуске.argc
Параметр представляет количество аргументов командной строки, иchar *argv[]
представляет собой массив строк (указатели символов) , представляющие собой отдельные аргументы , предусмотренные в командной строке.источник
argv[0]
что бы программа, запускающая программу на C, дала это какargv[0]
. В случае с Bash это часто (возможно, всегда) путь к исполняемому файлу, но Bash - не единственная программа, которая выполняет другие программы. Это permissisble, хотя эксцентричный, чтобы использовать:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. На многих системах значение воспринимается программой какargv[0]
будетcat
, хотя исполняемый файл есть/bin/ls
.main
Функция может иметь два параметра,argc
иargv
.argc
является целочисленнымint
параметром ( ), и это число аргументов, переданных программе.Имя программы всегда является первым аргументом, поэтому в программе будет хотя бы один аргумент, а минимальное значение
argc
будет одним. Но если программа имеет два аргумента, значениеargc
будет равно трем.Параметр
argv
указывает на массив строк и называется вектором аргумента . Это одномерный строковый массив аргументов функции.источник
Это простая декларация. Он не может принимать аргументы командной строки.
Это объявление используется, когда ваша программа должна принимать аргументы командной строки. Когда бегаешь так:
argc
или Счетчик аргументов будет установлен на 4 (четыре аргумента), аargv
Векторы аргументов будут заполнены строковыми указателями на «myprogram», «arg1», «arg2» и «arg3». Вызов программы (myprogram
) включен в аргументы!В качестве альтернативы вы можете использовать:
Это также верно.
Есть еще один параметр, который вы можете добавить:
envp
Параметр также содержит переменные окружения. Каждая запись имеет следующий формат:нравится:
Список переменных среды заканчивается нулем.
ВАЖНО: НЕ ИСПОЛЬЗУЙТЕ какие-
argv
либоenvp
значения или значения непосредственно в вызовахsystem()
! Это огромная дыра в безопасности, поскольку злоумышленники могут задавать переменные среды для команд командной строки и (потенциально) наносить огромный ущерб. В общем, просто не используйтеsystem()
. Почти всегда есть лучшее решение, реализованное с помощью библиотек C.источник
Первый параметр - это количество предоставленных аргументов, а второй параметр - список строк, представляющих эти аргументы.
источник
Оба
являются юридическими определениями точки входа для программы на C или C ++. Stroustrup: FAQ по стилю и технике C ++ подробно описывает некоторые варианты, которые возможны или допустимы для вашей основной функции.
источник
int main()
==>int main(void)
... для совместимости и читабельности. Я не знаю, позволяют ли все более старые версии C пустым функциям иметь пустой список параметров в объявлении.void
это необходимо. Не цитируйте меня об этом, и теперь я знаю, что это слегка глупый комментарий. Это не может повредить, хотя.