Почему timespec_get не определен ни на одном компиляторе C на моем Mac?

Согласно стандарту C11 (7.27.2.5), есть функция timespec_get указано в time.h, Я пробовал несколько компиляторов, включая clang и несколько версий gcc, которые должны поддерживать C11, но эта функция всегда отсутствует. Макрос TIME_UTC также отсутствует.

Вот тестовый файл mytime.c:

#include <time.h>
#include <stdio.h>
int main() {
  printf("C version: %ld\n", __STDC_VERSION__);
  fflush(stdout);
  struct timespec ts;
  timespec_get(&ts, TIME_UTC);
}

и вывод с использованием Clang:

$ cc --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ cc -std=c11 mytime.c
mytime.c:9:3: warning: implicit declaration of function 'timespec_get' is invalid in C99
      [-Wimplicit-function-declaration]
  timespec_get(&ts, TIME_UTC);
  ^
mytime.c:9:21: error: use of undeclared identifier 'TIME_UTC'
  timespec_get(&ts, TIME_UTC);
                    ^
1 warning and 1 error generated.

Я закомментировал timespec_get линия, чтобы убедиться, что я использую C11, и я.

Я получаю в основном те же результаты для gcc версий 4.8, 5 и 6.

Я использую Mac, OS 10.11.6.

2 ответа

Стандартная библиотека Mac OS X не соответствует ни одной современной версии C или POSIX. Он застрял на C99 и POSIX 2001 и имеет проблемы с соответствием даже по отношению к ним.

Mac 10.15 поддерживает. Это взято из /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/time.h:

      #if (__DARWIN_C_LEVEL >= __DARWIN_C_FULL) && \
        ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
        (defined(__cplusplus) && __cplusplus >= 201703L))
/* ISO/IEC 9899:201x 7.27.2.5 The timespec_get function */
#define TIME_UTC        1       /* time elapsed since epoch */
__API_AVAILABLE(macosx(10.15), ios(13.0), tvos(13.0), watchos(6.0))
int timespec_get(struct timespec *ts, int base);
#endif

Вы должны строить с C11 или C ++ 17, когда time.h Включено.

Я не проводил никаких расчетов времени или другого расследования того, gettimeofday или лучше для этого на Mac 10.15, только что timespec_get становится доступным.

Другие вопросы по тегам