2016-01-29 19 views
-2

在你閱讀這個問題之前,只要知道這是「對於顧客」,因此我在這件事上沒有選擇。c90,POSIX和clock_gettime

因此,我們的客戶正在爲他們的項目使用c90標準。直到這一點,我們一直在使用c99,並樂於這樣做。我們完成此任務的功能是clock_gettime。我們需要一種方法來獲得準確的時間毫秒以用於計時。

我看了一下C90實現time.h中,發現time(time_t*)只有在秒級精確。 clock應該讓我知道自程序開始運行以來已經過了多少點擊,但這種情況反而不穩定。 A printf我有10000次重複,而循環回來時的值爲30到120之間的clock()。這太不穩定了。

所以,問題是,有人知道一個很好的c90兼容方式來獲得毫秒準確的系統時間嗎?我們只對兩個讀數的三角洲感興趣。

感謝, soulsabr

編輯:正如zwol指出,我忘了說我知道clock_gettime是POSIX。我認爲只要使用-std=c90的cygwin上的gcc不會抱怨我們,我們對結果不會太挑剔。 :)在我的防守中,我整天都在使用Google,並且我的大腦受傷了。

編輯2:進一步研究後,我懷疑我可能會問錯了問題,由於我不理解POSIX到底是什麼,它被定義的時候。所以,通過.h尋找time.h我注意到_POSIX_TIMERS沒有定義,當使用-std=90這就是爲什麼我不能使用clock_gettime。定義_POSIX_TIMERS使一切正常。所以,我想我應該問的問題是「打開缺少的POSIX功能」的正確方法是什麼?或者您認爲簡單地定義_POSIX_TIMERS是一個合適的解決方案?

此外,如果有人認爲我應該核彈這個問題,並要求重新讓我知道,我會的。

+4

'clock_gettime'也不在C99中,只在POSIX中。 (它是*,iirc,在C11中)。在此基礎上,您可能會回到客戶身邊,爭論使用POSIX功能,而C90無法實現您的目標。但是,如果你需要使用C90而沒有其他的東西,那麼你就會被洗淨。 C90根本不提供你需要的東西。 – zwol

+0

我想,你有一個理由不能使用'gettimeofday()'? – SergeyA

+0

@zwol如果可以在gcc中使用POSIX並將-std = c90標誌設置爲我全部爲它。據我所知,它必須在cygwin下用該標誌準確編譯和運行。 – soulsabr

回答

3

如果clock_gettime不可用,另外兩個要嘗試的功能是ftimegettimeofday。 (ftime真的很老,但它確實會給你亞秒)。

正如你可能知道,你的編譯器是否接受這些功能並不一定依賴於編譯器的語言設置(C90或C99或C11)。它主要取決於您包含哪些頭文件以及C庫和OS支持的功能。

對於clock_gettime你應該包括<time.h>
對於gettimeofday,您應該包含<sys/time.h>
對於ftime,您應該包含<sys/timeb.h>


附錄:作爲@nos在評論中指出,有時你必須#定義一些符號,使這些操作系統特定的,非C函數。

+0

這並不完全正確。許多系統(我懷疑cygwin也是如此)只會暴露C90/C99等功能。 time.h如果只啓用C90或C99,並且不公開Posix擴展。您可以在包含這樣一個頭部以啓用posix擴展之前定義_POSIX_C_SOURCE 200809L。 – nos

+0

@nos:好點。編輯我的答案。 –