2014-02-21 4 views
6

я побежал в функцию, как это раньше:Основная функция с тремя аргументами

int main(int argc, char **argv, char **argw){ 


} 

Почему существует необходимость трех аргументов, и как это на самом деле работает?

+1

Похоже, связанные с получением [переменных окружения] (http://stackoverflow.com/questions/16765545/how-to-list-all-environment-variables-in-acc-app) некоторые подробности помог бы. –

+0

Как я помню, переменная действительно называлась envp. Означает ли это, что ** argw не является аргументом, предоставленным из командной строки? – user1090614

+0

Это переменные среды вашей оболочки в Unix. Поэтому он не указан в командной строке и не переносится. OSX добавляет 4-й аргумент 'apple', который я расскажу в своем ответе, указанном выше. –

ответ

7

Третий аргумент обычно называется envp.

int main(int argc, char **argv, char **envp) { 

Многие компиляторы обеспечивают третий аргумент main, но это не указано в стандарте C, поэтому его использование не определено поведение. Если вы попытаетесь перенести код на платформу, которая не предоставляет третий параметр, программа скорее всего потерпит неудачу.

Is char *envp[] as a third argument to main() portable

+3

Более портативно переменные окружения могут быть доступны через функцию getenv, хотя это требует знания имени переменной, к которой вы хотите обратиться. Кроме того, POSIX указывает «extern char ** environ;» (который по какой-либо причине не объявляется ни в одном заголовке). –

0

Я уже видел эти аргументы. Мой компилятор размещает их там также при запуске в C++-коде. Я могу сказать вам, что они не нужны в C++, хотя я не могу сказать точно в C. Они выглядят как слоты для переменных, которые должны быть переданы функции int main. Один из типов int и два типа char. Эти переменные будут переданы, как правило, пользователем во время выполнения программы.

+0

Второй (и необязательный третий) параметр имеет тип 'char **', а не 'char'. –

+0

@KeithThompson Если это не так, как в C, чем в C++, это, похоже, не так, поскольку оба кажутся «char (имя переменной)», где '**' является частью имени переменной. Хотя, это странно, поскольку оно нарушает правила именования переменных, если только компилятор не видит '*' как «подстановочный знак». – NanoCarp

+0

Это то же самое на C и C++. Синтаксис объявления немного нечетный, но он основан (не полностью последовательно) по принципу, согласно которому объявление следует использовать. Синтаксис 'char ** argv' означает, что' ** argv' имеет тип 'char'; из этого следует, что 'argv' имеет тип' char ** '. Имя переменной просто 'argv'; '**' не является частью имени переменной, это часть синтаксиса объявления. –

Смежные вопросы