я побежал в функцию, как это раньше:Основная функция с тремя аргументами
int main(int argc, char **argv, char **argw){
}
Почему существует необходимость трех аргументов, и как это на самом деле работает?
я побежал в функцию, как это раньше:Основная функция с тремя аргументами
int main(int argc, char **argv, char **argw){
}
Почему существует необходимость трех аргументов, и как это на самом деле работает?
Третий аргумент обычно называется envp
.
int main(int argc, char **argv, char **envp) {
Многие компиляторы обеспечивают третий аргумент main
, но это не указано в стандарте C, поэтому его использование не определено поведение. Если вы попытаетесь перенести код на платформу, которая не предоставляет третий параметр, программа скорее всего потерпит неудачу.
Более портативно переменные окружения могут быть доступны через функцию getenv, хотя это требует знания имени переменной, к которой вы хотите обратиться. Кроме того, POSIX указывает «extern char ** environ;» (который по какой-либо причине не объявляется ни в одном заголовке). –
Я уже видел эти аргументы. Мой компилятор размещает их там также при запуске в C++-коде. Я могу сказать вам, что они не нужны в C++, хотя я не могу сказать точно в C. Они выглядят как слоты для переменных, которые должны быть переданы функции int main
. Один из типов int
и два типа char
. Эти переменные будут переданы, как правило, пользователем во время выполнения программы.
Второй (и необязательный третий) параметр имеет тип 'char **', а не 'char'. –
@KeithThompson Если это не так, как в C, чем в C++, это, похоже, не так, поскольку оба кажутся «char (имя переменной)», где '**' является частью имени переменной. Хотя, это странно, поскольку оно нарушает правила именования переменных, если только компилятор не видит '*' как «подстановочный знак». – NanoCarp
Это то же самое на C и C++. Синтаксис объявления немного нечетный, но он основан (не полностью последовательно) по принципу, согласно которому объявление следует использовать. Синтаксис 'char ** argv' означает, что' ** argv' имеет тип 'char'; из этого следует, что 'argv' имеет тип' char ** '. Имя переменной просто 'argv'; '**' не является частью имени переменной, это часть синтаксиса объявления. –
Похоже, связанные с получением [переменных окружения] (http://stackoverflow.com/questions/16765545/how-to-list-all-environment-variables-in-acc-app) некоторые подробности помог бы. –
Как я помню, переменная действительно называлась envp. Означает ли это, что ** argw не является аргументом, предоставленным из командной строки? – user1090614
Это переменные среды вашей оболочки в Unix. Поэтому он не указан в командной строке и не переносится. OSX добавляет 4-й аргумент 'apple', который я расскажу в своем ответе, указанном выше. –