Почему 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, ОС 10.11.6.


person Steve Siegel    schedule 26.08.2018    source источник
comment
Функции определяются в библиотеках, а не в компиляторах. Может быть, библиотеки OS X просто не поддерживают эту функцию?   -  person melpomene    schedule 26.08.2018
comment
FWIW, gcc и clang на моем Mac также не поддерживают его. Я использую gettimeofday, чтобы получить меньше секунды. (Макинтош также не поддерживает Posix clock_gettime.) Есть также несколько Функции часов Darwin.   -  person Steve Summit    schedule 26.08.2018


Ответы (2)


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

person R.. GitHub STOP HELPING ICE    schedule 26.08.2018
comment
ОП должен отметить, что современные компиляторы C в значительной степени относятся к Linux. В Windows MSVC представляет собой странный гибрид C89 и нескольких фрагментов, заимствованных из более поздних спецификаций. Если вы когда-нибудь захотите, чтобы ваш C-код был переносимым, вы в значительной степени захотите придерживаться функций C89, как бы болезненно это ни было. - person lockcmpxchg8b; 26.08.2018
comment
@lockcmpxchg8b: я думаю, что это искажение и путает проблему библиотеки (о которой этот вопрос) с проблемой компилятора (MSVC - мусор). На стороне компилятора есть поддержка C99 и C11 практически для каждой современной платформы (GCC и clang/llvm поддерживают почти все), а современный MSVC даже отчасти стремится поддерживать современные стандарты (они утверждают, что современный C++; современный С менее надежен). - person R.. GitHub STOP HELPING ICE; 26.08.2018
comment
Хм. Я полагаю, было неосторожно сказать, что компилятор, а не языковая реализация, что и было целью. (Особенно учитывая, что содержимое time.h является частью спецификации C.) Я не думаю, что с понятием переносимости можно сказать, что оно переносимо, если на вашей платформе есть GCC, но это не имеет отношения к вопросу ОП. . - person lockcmpxchg8b; 26.08.2018
comment
Итак, Apple мешает мне иметь соответствующую реализацию C11? Кто-нибудь знает, почему? Все деньги мира, а реализовать timespec_get не могут? - person Steve Siegel; 29.08.2018
comment
@SteveSiegel: В принципе, вы можете использовать альтернативную реализацию стандартной библиотеки, но это будет потенциально несовместимо со всей библиотечной экосистемой, и, насколько я знаю, для OSX не существует. В качестве альтернативы вы можете добавить дополнительную библиотеку с этими функциями и исправить стандартные заголовки, чтобы добавить необходимые объявления и т. д. (или добавить каталог заголовков наложения в начало пути включения и использовать нестандартную функцию #include_next), чтобы получить отсутствует функциональность библиотеки C11. - person R.. GitHub STOP HELPING ICE; 29.08.2018
comment
Вы имеете в виду, что все, что я устанавливаю с помощью brew install, избегает этой функции? Я не верю. Это должен быть какой-то параметр конфигурации, и я не понимаю, почему этот ответ принят. Мой clang - 1001, и у меня есть эта проблема, в то время как онлайн-компилятор coliru имеет clang 5 и компилирует код без проблем. - person Nakilon; 09.03.2021
comment
да. Я никогда не видел, чтобы какой-либо реальный код использовал эту функцию, потому что это менее функциональный клон стандарта POSIX clock_gettime. - person R.. GitHub STOP HELPING ICE; 09.03.2021

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

Вам нужно собирать с помощью C11 или C++17, когда включен time.h.

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

person Levi Morrison    schedule 02.04.2021