เหตุใดจึงไม่กำหนด 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


person Steve Siegel    schedule 26.08.2018    source แหล่งที่มา
comment
ฟังก์ชั่นถูกกำหนดไว้ในไลบรารี ไม่ใช่คอมไพเลอร์ บางทีไลบรารี OS X อาจไม่รองรับฟังก์ชันนั้นใช่ไหม   -  person melpomene    schedule 26.08.2018
comment
FWIW, gcc และ clang บน Mac ของฉันไม่รองรับเช่นกัน ฉันใช้ gettimeofday เพื่อรับเวลารอง (เครื่อง Mac ก็ไม่รองรับ Posix clock_gettime เช่นกัน) นอกจากนี้ยังมี ฟังก์ชันนาฬิกาเฉพาะของดาร์วิน   -  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
OP ควรทราบว่าคอมไพเลอร์ C สมัยใหม่นั้นค่อนข้างจะเป็น Linux บน windows MSVC เป็นลูกผสมที่แปลกประหลาดของ C89 และมีบางส่วนที่ยืมมาจากข้อกำหนดในภายหลัง หากคุณต้องการให้โค้ด C ของคุณพกพาได้ คุณคงอยากจะยึดติดกับฟีเจอร์ของ C89 แม้ว่าจะเป็นเรื่องที่เจ็บปวดก็ตาม - person lockcmpxchg8b; 26.08.2018
comment
@ lockcmpxchg8b: ฉันคิดว่านั่นเป็นการบิดเบือนความจริงและทำให้ปัญหา ไลบรารี (ซึ่งคำถามนี้เกี่ยวกับ) สับสนกับปัญหาคอมไพเลอร์ (MSVC เป็นขยะ) ฝั่งคอมไพเลอร์มีการรองรับ C99 & C11 สำหรับทุกแพลตฟอร์มที่มีความเกี่ยวข้องสมัยใหม่ (GCC และ clang/llvm รองรับเกือบทุกอย่าง) และ MSVC สมัยใหม่แม้แต่ kinda ก็มีเป้าหมายที่จะสนับสนุนมาตรฐานสมัยใหม่ (พวกเขาอ้างว่า C++ สมัยใหม่; ทันสมัย C มีความน่าเชื่อถือน้อยกว่า) - person R.. GitHub STOP HELPING ICE; 26.08.2018
comment
อืม. ฉันคิดว่ามันไม่ระมัดระวังที่จะพูดว่าคอมไพเลอร์มากกว่าการใช้ภาษาซึ่งเป็นเจตนา (โดยเฉพาะอย่างยิ่งเนื่องจากเนื้อหาของ time.h เป็นส่วนหนึ่งของข้อกำหนด C) ฉันไม่คิดว่ามันสอดคล้องกับแนวคิดเรื่องการพกพาที่จะบอกว่าสามารถพกพาได้ตราบใดที่คุณมี GCC บนแพลตฟอร์มของคุณ แต่นั่นไม่เกี่ยวข้องกับคำถามของ OP . - person lockcmpxchg8b; 26.08.2018
comment
Apple กำลังขัดขวางไม่ให้ฉันใช้งาน C11 ตามมาตรฐานใช่ไหม ไม่มีใครรู้ว่าทำไม? เงินทั้งหมดในโลกและพวกเขาไม่สามารถดำเนินการ timespec_get ได้? - person Steve Siegel; 29.08.2018
comment
@SteveSiegel: โดยหลักการแล้วคุณสามารถใช้การใช้งานแบบอื่นของไลบรารีมาตรฐานได้ แต่นั่นอาจไม่เข้ากันกับระบบนิเวศของไลบรารีทั้งหมดและ AFAIK ไม่มีสำหรับ OSX หรือคุณสามารถเพิ่มไลบรารีรองที่มีฟังก์ชันเหล่านี้และแก้ไขส่วนหัวมาตรฐานเพื่อเพิ่มการประกาศที่จำเป็น ฯลฯ (หรือเพิ่มไดเร็กทอรีของส่วนหัวแบบซ้อนทับที่จุดเริ่มต้นของเส้นทางรวม และให้พวกเขาใช้คุณลักษณะ #include_next ที่ไม่เป็นมาตรฐาน) เพื่อรับ ไม่มีฟังก์ชันการทำงานของไลบรารี C11 - person R.. GitHub STOP HELPING ICE; 29.08.2018
comment
คุณหมายถึงทุกสิ่งที่ฉันติดตั้งด้วย brew install หลีกเลี่ยงฟังก์ชันนี้หรือไม่ ฉันไม่เชื่อมัน ต้องเป็นตัวเลือกการกำหนดค่าบางอย่างและฉันไม่เห็นว่าทำไมคำตอบนี้จึงได้รับการยอมรับ เสียงดังกราวของฉันคือ 1,001 และมีปัญหานี้ในขณะที่คอมไพเลอร์ออนไลน์ coliru มีเสียงดังกราว 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