Функция getopt_long
из стандартной библиотеки языка C используется для обработки командной строки с длинными опциями (long options) и их аргументами.
Сигнатура функции getopt_long
:
int getopt_long(int argc, char *const argv[], const char *shortopts, const struct option *longopts, int *longindex);
Основные параметры функции:
- argc
: количество элементов в массиве argv
- argv
: массив строк, содержащих аргументы командной строки
- shortopts
: строка коротких опций
- longopts
: массив структур option
, описывающих длинные опции
- longindex
: указатель на переменную, в которой будет храниться индекс найденной длинной опции
Структура option
определена следующим образом:
struct option { const char *name; // Имя длинной опции int has_arg; // Флаг описывающий аргумент опции int *flag; // Если flag != NULL, возвращается значение val int val; // Значение опции };
Следующий пример демонстрирует использование getopt_long
:
#include <stdio.h> #include <getopt.h> int main(int argc, char *argv[]) { int option; int longindex = 0; // Массив структур option struct option long_options[] = { {"help", 0, NULL, 'h'}, {"output", 1, NULL, 'o'}, {NULL, 0, NULL, 0} }; while ((option = getopt_long(argc, argv, "ho:", long_options, &longindex)) != -1) { switch (option) { case 'h': printf("Usage: program [OPTIONS]n"); printf("-h, --helpttPrint this help messagen"); printf("-o, --output <file>tSpecify output filen"); return 0; case 'o': printf("Output file: %sn", optarg); break; default: printf("Unknown option: %cn", option); return 1; } } for (int i = optind; i < argc; i++) { printf("Non-option argument: %sn", argv[i]); } return 0; }
В данном примере программа имеет две опции: -h
и -o
(соответствующая --help
и --output
соответственно). Опция -o
принимает аргумент (имя файла), который передается через параметры командной строки. Если передана опция -h
, программа выводит справочную информацию. Если передана опция -o
с аргументом, программа выводит имя файла.
Для использования getopt_long
необходимо включить заголовочный файл getopt.h
, а при компиляции указать флаг -l getopt
.