簡體   English   中英

麻煩是ctime,time.h,sys / time.h

[英]The mess that is ctime, time.h, sys/time.h

我希望一些Linux頑固的人可以回答我在處理時間函數時應該如何編寫可移植(POSIX)代碼。

  • 一些SO線程表明在編寫C ++代碼時包含ctime是正確的做法,而對於C代碼,你仍然會包含time.h。 但是,它們都定義了相同的功能,盡管在不同的命名空間中。 從技術上講,你應該能夠指定兩者。

  • 一篇SO帖子建議一個人應該避免使用基於sys / *的包括all ..

  • ..雖然這個線程暗示在包含sys / resources.h之前必須包含sys / time.h,特別是對於基於BSD的平台。

  • 這篇文章說包括sys / time.h提高了可移植性。 我想海報認為它允許你鏈接更多使用gettimeofday等特定功能的第三方圖書館..但是..

  • 不鼓勵 gettimeofday() ,現在正在享受棄用狀態,所以我應該使用clock_gettime()代替。 這個clock_gettime()在time.h中定義,參見https://linux.die.net/man/3/clock_gettime ..

  • ..如果一個人安裝並與libavutil鏈接(例如作為ffmpeg-dev的一部分),很明顯time.h是為了讓人們瘋狂而創建的 Ffmpeg(以及其他一些libs)擁有自己的time.h,甚至還有timeb.h。 事實證明,如果在構建堆棧任何地方的.c和以往的.cpp 包括 time.h中,與持有多個有效條目(包括路徑包括一個ffmpeg的 ),它可能是指到錯誤之一,並且聲明只需更換。 @ FFmpeg,推理似乎是一個丑陋的黑客足以解決問題。 我還沒那么幸運。 此外,Php-izing所有來源根本不是一個解決方案。

  • 另一個time.h存在於我的系統上的usr / include / i386-linux-gnu / bits中,所以這也不是一個只有ffmpeg的現象。 簡單地將usr / include / i386-linux-gnu稱為包含路徑因此變得致命,這在引用系統包含時是奇怪的。

  • 我重寫了我的CMake腳本,注意為大多數目標使用專用的include文件夾規范 我已經嘗試將time.h / ctime和sys / time.h中的各種排列包含在整個代碼庫中引用的預編譯頭中。 我仍然得到如下錯誤:

錯誤:字段'st_atim'具有不完整類型'timespec',struct timespec st_atim;

錯誤:':: time'尚未聲明

等等..

因此,對於與許多第三方依賴關系鏈接的C ++設置,確保所有內容一直在編譯包含time.h的wrt的正確方法是什么? 我應該將time.h包含在我正在編譯的特定平台上嗎? 我應該查看可能需要time.h的所有目標嗎? 跳舞大象和五彩紙屑躺在前面。


更新:該問題似乎與C ++版本有關,如下面的評論中所暗示的那樣。 我已經將gcc更新到8.3.0(從5.4),並且我已經放棄了在linux下支持c ++ 11以下的舊c ++兼容性。 在更新並重建所有第三方軟件包(包括ffmpeg)之后,我現在不再遇到我所描述的問題,但這並不意味着它已被修復,因為它不能再為其他人發生。 事實上,我認為問題主要在於ffmpeg如何編譯舊編譯器並且沒有明確請求c ++ 11,所以我將其保持開放狀態。

我建議你考慮一下Howard Hinnant的date庫已經被接受到下一版本的C++標准庫( C++20 ):

https://github.com/HowardHinnant/date

它應該適用於任何支持C++11以上版本的平台。

標准版本在此處記錄: https//en.cppreference.com/w/cpp/chrono

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM