Как узнать, к какому значению я должен определить _POSIX_C_SOURCE? - PullRequest
0 голосов
/ 04 мая 2018

Скажем, например, что я хочу использовать структуру timespec, которая определена в time.h. В соответствии с man-страницами мне нужно только указать time.h. Но при компиляции в c99 этого недостаточно:

#include <stdio.h>
#include <time.h>

struct timespec abcd;

int main(int argc, char *argv[])
{
   return 0;
}

В соответствии с информацией, которую я нахожу в Интернете (не на страницах руководства), мне нужно добавить следующее:

#define _POSIX_C_SOURCE 200809L

Итак, у меня есть несколько вопросов:

  • Как узнать, какому значению _POSIX_C_SOURCE нужно быть равным? Я нашел несколько значений в Интернете.

  • Почему размещение этого определения влияет на компиляцию? (ср. ниже)

#include <stdio.h>

#define _POSIX_C_SOURCE 200809L

#include <time.h>

struct timespec abcd;

int main(int argc, char *argv[]) { return 0; }

$ gcc test.c -Wall -Wpedantic -std=c99 -o test test.c:9:25: error: field ‘time_last_package’ has incomplete type struct timespec time_last_package;

хорошо компилируется:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <time.h>
....

Спасибо

1 Ответ

0 голосов
/ 04 мая 2018
  • Как узнать, какому значению _POSIX_C_SOURCE нужно быть равным? Я нашел несколько значений в Интернете.

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

  1. определяет необходимую вам функциональность
  2. поддерживается вашей хостинговой ОС

Лучше всего использовать наименьшее значение, соответствующее обоим этим критериям.

  • Почему размещение этого определения влияет на компиляцию?

POSIX говорит:

Системный интерфейс Глава 2. Раздел 2 Среда компиляции : POSIX-совместимое приложение должно обеспечить проверку функциональности макрос _POSIX_C_SOURCE определяется перед включением любого заголовка.

В противном случае это может привести к неправильным / несовместимым включенным определениям ... Определение его до любое включение гарантирует, что все находятся под одной и той же версией POSIX ...

Рекомендуемое чтение: Базовые спецификации Open Group Issue 7, издание 2018 года, 2 - Общая информация

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