簡體   English   中英

實現定義類型的格式說明符,如time_t

[英]Format specifiers for implementation-defined types like time_t

我想讓我的代碼更加平台/實現獨立。 在編譯代碼時,我不知道在平台上將實現什么time_t 我如何知道t的類型以確定要使用的格式說明符?

...
time_t t = time(NULL);
printf("%s", t);
...

通常,您可以使用強制轉換將操作數轉換為您知道正確格式的某種類型。

您提出的解決方案

time_t t = time(NULL);
printf("%s", t);

顯然行不通的,因為time_t是數值型,不char*

通常,我們知道time_t是算術類型。 像這樣的東西:

 printf("%ld\n", (long)t);

可能適用於大多數系統。 它可能失敗(a)如果time_t是無符號類型,不寬於unsigned long並且t的當前值超過LONG_MAX ,或者(b)如果time_t是浮點類型。

如果你有C99支持,你可以使用long long ,這是一個更好的:

printf("%lld\n", (long long)t);

如果你真的想要過度使用可移植性,你可以檢測出time_t的類型:

if ((time_t)-1 > 0) {
    // time_t is an unsigned type
    printf("%ju\n", (uintmax_t)t);
}
else if ((time_t)1 / 2 > 0) {
    // time_t is a signed integer type
    printf("%jd\n", (intmax_t)t);
}
else {
    // time_t is a floating-point type (I've never seen this)
    printf("%Lg\n", (long double)t);
}

您可能希望將%Lg格式調整為%Lg %Lf%.10Lf ,具體取決於您想要的輸出格式。

同樣,這假設C99支持 - 您需要#include <stdint.h>才能使uintmax_tintmax_t可見。

time_tclock_t有點不尋常,因為標准表示它們是能夠表示時間的算術類型。 (原則上它們可能是復雜的類型,但我會說忽略這種可能性值得冒險。)

在大多數其他情況下,您可能知道給定類型是有符號類型,無符號類型還是浮點數,並且您只能轉換為最類型的類型。

請注意,如果您不知道time_t的表示方式,您可能無法理解printf的輸出(例如1379375215 ) - 除非您的目標是弄明白。

(如果用C ++而不是C編程, std::cout << t << "\\n";會自動使用正確的重載operator<< 。)

如果你想要人類可讀的輸出(比如Mon 2013-09-16 16:46:55 PDT ),你會想要使用<time.h>聲明的轉換函數之一,例如asctime()strftime()

通常,顯示time_t值的方法是使用gmtimelocaltime將其組件分解為struct tm並顯示它們或根據需要使用strftimectime將它們直接從time_t轉換為顯示本地時間的字符串。

如果您想出於某種目的看原始值,C標准指定time_t實數 ,這意味着它是整數或浮點數(C 2011(N1570)6.2.5 17)。 因此,您應該能夠將其轉換為double並打印出來。 time_t可能代表double不能的值,因此如果你想要關注異國情調的實現,你可能不得不提防。 由於difftime將兩個time_t對象的差異作為double ,因此C似乎並不真正支持time_t ,其精度高於double

您可以使用difftime()來獲取double

time_t t = time(NULL);
printf("seconds 1970->now: %.f\n", difftime(t, (time_t) 0));

它很簡單,我認為它是便攜式的。

C標准說time_t將是'真實類型'(意思是整數類型或浮點類型,但實際上它總是整數類型)。

使用time_t ,最好的辦法是在使用localtime()gmtime()分析后用strftime()格式化它 - 這可以通過移植來完成。

不可思議的是,您必須通過某種機制確定什么是正確的格式說明符。 您可以使用PRI_[Xxodi]_timeSCN_[Xxodi]_time或類似的非標准但接近標准的東西(不會踐踏保留的命名空間 - 這是起始PRI或SCN后跟小寫字母的名稱或X)。 您可以使用某種機制來指定...將不可移植的信息封裝在一個地方。

暫無
暫無

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

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