Как обработать — в getopt_long?

Функция 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.