Класс для обработки параметров командной строки
Чтобы не перегружать функцию main()
деталями, касающимися обработки параметров командной строки, лучше отделить этот фрагмент. Можно написать для этого функцию. Например:
extern int parse_options( int arg_count, char *arg_vector ); int main( int argc, char *argv[] ) { // ... int option_status; option_status = parse_options( argc, argv ); // ... |
}
Как вернуть несколько значений? Обычно для этого используются глобальные объекты, которые не передаются ни в функцию для их обработки, ни обратно. Альтернативной стратегией является инкапсуляция обработки параметров командной строки в класс.
Данные-члены класса представляют собой параметры, заданные пользователем в командной строке. Набор открытых встроенных функций-членов позволяет получать их значения. Конструктор инициализирует параметры значениями по умолчанию. Функция-член получает argc и argv в качестве аргументов и обрабатывает их:
#include <vector> #include <string> class CommandOpt { public: CommandOpt() : _limit( -1 ), _debug_on( false ) {} int parse_options( int argc, char *argv[] ); string out_file() { return _out_file; } bool debug_on() { return _debug_on; } int files() { return _file_names.size(); } string& operator[]( int ix ); private: inline void usage( int exit_value = 0 ); bool _debug_on; int _limit; string _out_file; vector<string> _file_names; static const char *const program_name; static const char *const program_version; |
};
Так выглядит модифицированная функция main():[18]
#include "CommandOpt.h" int main( int argc, char "argv[] ) { // ... CommandOpt com_opt; int option_status; opttion_status = com_opt. parse_options (argc, argv); // ... |
}
Упражнение 7.15
Добавьте обработку опций -t
(включение таймера) и -b
(задание размера буфера bufsize). Не забудьте обновить usage(). Например:
prog -t -b 512 dataO
Упражнение 7.16
Наша реализация не обрабатывает случая, когда между опцией и ассоциированным с ней значением нет пробела. Модифицируйте программу для поддержки такой обработки.
Упражнение 7.17
Наша реализация не может различить лишний пробел между дефисом и опцией:
prog - d dataO
Модифицируйте программу так, чтобы она распознавала подобную ошибку и сообщала о ней.
Упражнение 7.18
В нашей программе не предусмотрен случай, когда опции -l или -o
задаются несколько раз. Реализуйте такую возможность. Какова должна быть стратегия при разрешении конфликта?
Упражнение 7.19
В нашей реализации задание неизвестной опции приводит к фатальной ошибке. Как вы думаете, это оправдано? Предложите другое поведение.
Упражнение 7.20
Добавьте поддержку опций, начинающихся со знака плюс (+), обеспечив обработку +s и +pt, а также +sp и +ps. Предположим, что +s
включает строгую проверку синтаксиса, а +p допускает использование устаревших конструкций. Например:
prog +s +p -d -b 1024 dataO