Mengapa timespec_get tidak ditentukan pada kompiler C mana pun di Mac saya?

Menurut Standar C11 (7.27.2.5), ada fungsi timespec_get yang ditentukan dalam time.h. Saya telah mencoba beberapa kompiler, termasuk clang dan beberapa versi gcc, yang seharusnya mendukung C11, tetapi fungsi ini selalu hilang. Makro TIME_UTC juga hilang.

Ini file uji 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);
}

dan outputnya menggunakan Dentang:

$ 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.

Saya mengomentari baris timespec_get hanya untuk memastikan saya menggunakan C11, dan memang benar.

Saya pada dasarnya mendapatkan hasil yang sama untuk gcc versi 4.8, 5, dan 6.

Saya menggunakan Mac, OS 10.11.6.


person Steve Siegel    schedule 26.08.2018    source sumber
comment
Fungsi didefinisikan di perpustakaan, bukan di kompiler. Mungkin perpustakaan OS X tidak mendukung fungsi itu?   -  person melpomene    schedule 26.08.2018
comment
FWIW, gcc dan clang di Mac saya juga tidak mendukungnya. Saya menggunakan gettimeofday untuk mendapatkan waktu sub-detik. (Mac juga tidak mendukung Posix clock_gettime.) Ada juga beberapa Fungsi jam khusus Darwin.   -  person Steve Summit    schedule 26.08.2018


Jawaban (2)


Pustaka standar Mac OS X tidak sesuai dengan versi modern C atau POSIX. Itu macet di C99 dan POSIX 2001 dan memiliki masalah kesesuaian bahkan sehubungan dengan ini.

person R.. GitHub STOP HELPING ICE    schedule 26.08.2018
comment
OP harus mencatat bahwa kompiler C modern hampir sama dengan Linux. Di windows, MSVC adalah hibrida aneh dari C89 dan beberapa bagian dipinjam dari spesifikasi selanjutnya. Jika Anda ingin kode C Anda portabel, Anda pasti ingin tetap menggunakan fitur C89, meskipun itu sulit. - person lockcmpxchg8b; 26.08.2018
comment
@lockcmpxchg8b: Menurut saya itu adalah representasi yang keliru dan mengacaukan masalah perpustakaan (yang menjadi inti pertanyaan ini) dengan masalah kompiler (MSVC adalah sampah). Di sisi kompiler terdapat dukungan C99 & C11 untuk pada dasarnya setiap platform yang memiliki relevansi modern (GCC dan clang/llvm mendukung hampir semuanya) dan MSVC modern bahkan agak bertujuan untuk mendukung standar modern (mereka mengklaim C++ modern; modern C kurang dapat diandalkan). - person R.. GitHub STOP HELPING ICE; 26.08.2018
comment
Hmm. Saya kira ceroboh untuk mengatakan kompiler daripada implementasi bahasa yang merupakan tujuannya. (Terutama mengingat konten time.h adalah bagian dari spesifikasi C.) Saya rasa tidak konsisten dengan gagasan portabilitas untuk mengatakan itu portabel selama Anda memiliki GCC di platform Anda, tapi itu tidak relevan dengan pertanyaan OP . - person lockcmpxchg8b; 26.08.2018
comment
Jadi Apple mencegah saya menerapkan implementasi C11 yang sesuai? Adakah yang tahu alasannya? Semua uang di dunia, dan mereka tidak dapat menerapkan timespec_get? - person Steve Siegel; 29.08.2018
comment
@SteveSiegel: Pada prinsipnya Anda dapat menggunakan implementasi alternatif dari perpustakaan standar, tetapi hal itu berpotensi tidak kompatibel dengan keseluruhan ekosistem perpustakaan dan AFAIK tidak ada untuk OSX. Alternatifnya, Anda dapat menambahkan perpustakaan sekunder dengan fungsi-fungsi ini dan menambal header standar untuk menambahkan deklarasi yang diperlukan, dll. (atau menambahkan direktori header overlay ke awal jalur penyertaan dan meminta mereka menggunakan fitur #include_next yang tidak standar) untuk mendapatkan fungsionalitas perpustakaan C11 hilang. - person R.. GitHub STOP HELPING ICE; 29.08.2018
comment
Apakah maksud Anda semua hal yang saya instal dengan brew install menghindari fungsi ini? Saya tidak percaya. Itu pasti ada opsi konfigurasi dan saya tidak mengerti mengapa jawaban ini diterima. Dentang saya adalah 1001 dan mengalami masalah ini sedangkan kompiler online coliru memiliki dentang 5 dan mengkompilasi kode tanpa masalah. - person Nakilon; 09.03.2021
comment
Ya. Saya belum pernah melihat kode dunia nyata menggunakan fungsi ini karena ini merupakan tiruan POSIX clock_gettime yang kurang berfungsi. - person R.. GitHub STOP HELPING ICE; 09.03.2021

Mac 10.15 mendukung timespec_get. Ini diambil dari /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

Anda harus membangun dengan C11 atau C++17 ketika time.h disertakan.

Saya belum melakukan pengaturan waktu atau penyelidikan lain mengenai apakah gettimeofday atau timespec_get lebih baik untuk tujuan ini pada Mac 10.15, hanya timespec_get yang tersedia.

person Levi Morrison    schedule 02.04.2021