Есть ли стандартизированный способ разбора аргументов командной строки в 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 из других источников в вашу программу, таким образом защищая от сред, в которых его нет.