Обрабатывать argc и argv вне main ()

Если я хочу сохранить основную часть моего кода для обработки аргументов командной строки вне основного (для организации и более читабельного кода), что будет лучшим способом сделать это?

void main(int argc, char* argv[]){
//lots of code here I would like to move elsewhere
}

7

Решение

Либо передайте их в качестве параметров, либо сохраните их в глобальных переменных. Пока вы не вернетесь с основного и не попытаетесь обработать их в atexit Обработчик или деструктор объекта в глобальной области видимости, они все еще существуют и будут хорошо доступны из любой области видимости.

Например:

// Passing them as args:
void process_command_line(int argc, char **argv)
{
// Use argc and argv
...
}

int main(int argc, char **argv)
{
process_command_line(argc, argv);
...
}

В качестве альтернативы:

// Global variables
int g_argc;
char **g_argv;

void process_command_line()
{
// Use g_argc and g_argv
...
}

int main(int argc, char **argv)
{
g_argc = argc;
g_argv = argv;
process_command_line();
...
}

Передача их в качестве параметров — лучший дизайн, поскольку он инкапсулирован и позволяет изменять / заменять параметры, если вы хотите, или легко конвертировать вашу программу в библиотеку. Глобальные переменные проще, поскольку, если у вас есть много разных функций, которые по какой-либо причине обращаются к аргументам, вы можете просто сохранить их один раз, и вам не нужно будет передавать их между всеми различными функциями.

4

Другие решения

Нужно придерживаться стандартов везде, где это возможно. Таким образом, не пишите

void main

который никогда не был действительным C или C ++, но вместо этого напишите

int main

При этом ваш код может компилироваться, например, с помощью g ++ (с обычными настройками компилятора).

Учитывая void main Я подозреваю, что среда Windows. И все равно, для поддержки использования вашей программы в среде Windows, Вы не должны использовать main аргументы в винде. Они работают в * nix, потому что они были разработаны для этой среды; они вообще не работают в Windows, потому что по умолчанию (по очень строгому соглашению) они кодируются как Windows ANSI, что означает, что они не могут кодировать имена файлов с символами вне текущей локали пользователя.

Так что для Windows вам лучше использовать GetCommandLine Функция API и его сестринская функция разбора. Для переносимости это лучше включить в некоторый модуль аргументов командной строки. Тогда вам нужно разобраться с интересной проблемой использования wchar_t в Windows и char в * nix…

Во всяком случае, я не уверен в соответствующем * nix API, или даже если он есть, но Google его. В худшем случае для * nix вы всегда можете инициализировать модуль аргументов командной строки из main, Уродство * nix напрямую связано с необходимостью поддержки переносимости с помощью самой непереносимой, специфичной для ОС конструкции C ++, а именно стандартной main,

3

Просто пройти argc а также argv в качестве аргументов функции, в которой вы хотите их обработать.

void parse_arg(int argc, char *argv[]);

2

Проверьте «getoptlong«Семейство функций и библиотек. Они предлагают структурированный способ определения аргументов, ожидаемых вашей программой, и могут затем легко их проанализировать для вас. Также могут помочь с генерацией документации / справочных ответов.

Это старая библиотека в мире UNIX, и в C # также есть реализация .Net. (+ Perl, Ruby, & наверное больше. Приятно иметь единую парадигму, применимую ко всем этим! Учись один раз, используй везде!)

0

Linux предоставляет program_invocation_name а также program_invocation_name_short,

0