Есть ли стандартизированный способ анализа аргументов командной строки в C? - PullRequest
0 голосов
/ 22 ноября 2018

Я изучаю язык программирования 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 Ответ

0 голосов
/ 22 ноября 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...