Функция getopt
является сравнительно недавним дополнением к спецификации Single UNIX Specification / POSIX. Хотя Linux не соответствует POSIX, он примерно использует этот стандарт в качестве ориентира. Тем не менее, он в основном реализует X SH (системные заголовки) POSIX '03 или более ранних версий по умолчанию для совместимости. Если вы хотите, чтобы отображались более свежие добавления (Примечание: @JonathanLeffler упоминает, что getopt уже существует в течение достаточно долгого времени, но Linux все равно не предоставляет его по умолчанию), вы можете указать GNU lib c (C Библиотека, обычно используемая в системах GNU / Linux), которая также предоставляет некоторые из этих функций, которые скрыты за Макрокомандой тестирования . Найдите man-страницу man -s 7 feature_test_macros
2 в сочетании с man -s 3 getopt
1 , чтобы узнать больше. По сути, в соответствующих заголовках есть некоторый код, подобный следующему:
#if _POSIX_C_SOURCE >= 200809L
/* declaration of getopt() and other newer functions */
#endif
Если вы затем включите этот файл и не определите макрос теста возможностей, который будет иметь значение больше чем (более новый / более поздний, чем) дата того стандарта POSIX, который вам нужен (2008-09), препроцессор C отбросит все эти предварительные декларации, что приведет к ошибке вашего кода.
Использование -DFOO=bar
you #define FOO bar
в команде линия для стандартного C компилятора. Кстати, компилятор GNU C также устанавливает некоторые из таких флагов, когда вы используете -std=c99
.
В конце ваша командная строка должна выглядеть примерно так:
$ c99 -D_POSIX_C_SOURCE=200809L -o foo foo.c
Это скомпилирует и свяжет foo.c
с выходным файлом foo
, соответствующим стандарту C99 и использующим функции из POSIX '08 3 .