【问题标题】:Why isn't timespec_get defined on any C compiler on my Mac?为什么我的 Mac 上的任何 C 编译器都没有定义 timespec_get?
【发布时间】:2018-08-26 16:17:03
【问题描述】:

根据 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。

【问题讨论】:

  • 函数是在库中定义的,而不是在编译器中。也许 OS X 库根本不支持该功能?
  • 我的 Mac 上的 FWIW、gcc 和 clang 也不支持它。我使用gettimeofday 获得亚秒时间。 (Mac 也不支持 Posix clock_gettime。)还有一些 Darwin-specific clock functions

标签: c time c11 timespec


【解决方案1】:

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

【讨论】:

  • OP 应该注意现代 C 编译器几乎是 Linux 的东西。在 Windows 上,MSVC 是 C89 和从后来的规范中借来的一些零碎的奇怪混合体。如果您希望您的 C 代码具有可移植性,那么您非常希望坚持使用 C89 功能,尽管这样做很痛苦。
  • @lockcmpxchg8b:我认为这是一种误传,并将 library 问题(这个问题是关于)与编译器问题(MSVC 是垃圾)混为一谈。编译器方面,基本上每个现代相关平台都支持 C99 和 C11(GCC 和 clang/llvm 几乎支持一切),现代 MSVC 甚至 kinda 旨在支持现代标准(他们声称现代 C++;现代C 不太可靠)。
  • 嗯。我认为说“编译器”而不是“语言实现”是粗心的,这是本意。 (特别是考虑到time.h 的内容是 C 规范的一部分。)我认为说“只要你的平台上有 GCC,它就是可移植的”,我认为这与“可移植性”的概念不一致,但那是与OP的问题无关。
  • 所以 Apple 阻止我使用符合标准的 C11 实现?有谁知道为什么?全世界的钱都搞不定timespec_get
  • @SteveSiegel:原则上您可以使用标准库的替代实现,但这可能与整个库生态系统不兼容,并且不存在 OSX 的 AFAIK。或者,您可以添加具有这些函数的辅助库并修补标准标头以添加必要的声明等(或将覆盖标头的目录添加到包含路径的开头并让它们使用非标准 #include_next 功能)获取缺少的 C11 库功能。
【解决方案2】:

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 可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2012-05-09
    • 2016-02-18
    相关资源
    最近更新 更多