Есть ли стандартизированный способ анализа аргументов командной строки в C?

Я изучаю язык программирования C и пытаюсь сделать с ним некоторые базовые вещи. Проблема, с которой я столкнулся, заключается в том, как разобрать аргументы командной строки. Я прочитал этот ответ и попытался найти резюме библиотеки для unistd.h функционирует в стандарте N1570. Но, к сожалению, он там не определен (насколько я понимаю, работает только для POSIX-совместимых ОС).

AFAIK Windows не совсем совместима с POSIX, поэтому что-то вроде ответа, о котором я говорил выше

#include <unistd.h>

int main(int argc, char *argv[]){
    int opt;
    while((opt = getopt(argc, argv, "ilv") != -1){
        //do some with it
    }
}

не очень портативный.

ВОПРОС: Единственный стандартизированный и переносимый способ разбора аргументов командной строки - это сделать это самостоятельно?

1 ответ

Решение

Есть ли стандартизированный способ анализа аргументов командной строки в C?

Да, есть. Не стандартизировано комитетом C, но другими. Наиболее распространенным является POSIX с его утилитарными соглашениями и утилитой getopt. Использование синтаксиса аргументов GNU с argp просто весело и круто. Также широко используются GNU getopt_long для поддержки длинных аргументов с помощью getopt.

Единственный стандартизированный и переносимый способ разбора аргументов командной строки - это сделать это самостоятельно?

Не существует стандартизированного в C11 способа синтаксического анализа командной строки. C11 только указывает, что основные аргументы являются строками, но их значение определяется реализацией:

Если значение argc больше нуля, члены массива от argv[0] до argv[argc-1] включительно должны содержать указатели на строки, которым перед запуском программы присваиваются значения, определяемые реализацией средой хоста. Намерение состоит в том, чтобы предоставить программе информацию, определенную до ее запуска, из другой части размещенной среды.

Стандарт C не вводит абстракцию "командной строки", поэтому абстракция, состоящая из "аргументов командной строки" и, более того, "разбора аргументов командной строки", просто не определена. Я думаю, что введение стандартизированного способа разбора аргументов командной строки выходит за рамки стандарта Си.

Самый переносимый способ - написать и использовать наиболее переносимый код. Действительно, самый переносимый код не будет использовать какие-либо нестандартные библиотеки C и "делать это самостоятельно" самым переносимым способом. Нет смысла ориентироваться на все возможные архитектуры и среды. Если вы собираетесь только для GNU/Linux, я бы пошел с getopt если вы хотите оставаться портативным в какой-то сумасшедшей обстановке и для argp если вы хотите просто ориентироваться на конкретные системы GNU / Linux. getopt действительно широко распространен, даже библиотека для встроенных систем, таких как newlib getopt а также getopt_long реализованы. Для других вы можете просто скопировать / включить код для getopt из других источников в вашу программу, таким образом защищая от сред, в которых его нет.

Другие вопросы по тегам