Как включить -D_POSIX_C_SOURCE = 200809 при компиляции кода - PullRequest
0 голосов
/ 22 февраля 2020

Я выполняю задание, которое гласит: «В данном коде скелета используется getopt. Если вы скомпилируете код с -std=c99, произойдет ошибка компиляции. Чтобы исправить ошибку, включите -D_POSIX_C_SOURCE=200809 при компиляции код. "

Я очень новичок в этом. Обычно я компилирую C программу с помощью G CC (имя программы), а затем набираю ./a.out.

Что мне нужно сделать здесь?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Предложение «Чтобы исправить ошибку, включайте -D_POSIX_C_SOURCE=200809 при компиляции кода» означает включение символов -D_POSIX_C_SOURCE=200809 в команду, которую вы используете для компиляции программы.

Например, если вы обычно используют gcc -o foo foo.c, измените его на gcc -o foo -D_POSIX_C_SOURCE=200809 foo.c.

Это аргумент командной строки, который указывает компилятору определить макрос препроцессора с именем _POSIX_C_SOURCE, который будет заменен на 200809. Этот макрос препроцессора используется различными заголовочными файлами для адаптации к различным версиям POSIX (с помощью операторов #if для проверки макроса). Например, если указать _POSIX_C_SOURCE как 200809 или оставить его неопределенным, заголовки не будут объявлять подпрограммы, которые были добавлены в POSIX только после версии POSIX 2008-09. Среди прочего, это позволяет избежать конфликтов с программами, написанными до этого, которые могли бы использовать имена этих подпрограмм для других целей (поскольку у них не было бы возможности узнать, какие имена заголовок POSIX определит в будущем).

Вы также можете определить макрос в своем исходном коде до включения любых заголовков, которые его используют, с помощью:

#define _POSIX_C_SOURCE 200809
0 голосов
/ 22 февраля 2020

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

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