为什么 Mac 上的任何 C 编译器都没有定义 timespec_get?

Why isn't timespec_get defined on any C compiler on my Mac?

根据C11标准(7.27.2.5),在time.h中指定了一个函数timespec_get。试过好几个编译器,包括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.

Mac OS X 标准库不符合任何现代版本的 C 或 POSIX。它卡在 C99 和 POSIX 2001 上,甚至在这些方面也存在一致性问题。

Mac 10.15 支持 timespec_get。这取自 /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

当包含 time.h 时,您需要使用 C11 或 C++17 进行构建。

对于 Mac 10.15 上 gettimeofdaytimespec_get 是否更适合此目的,我没有进行任何时间安排或其他调查,只是 timespec_get 可用。