Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

請問time_t、size_t是定義在哪個h檔?高點數20點

在c的函式庫中,請問在time函數中有time_t的型態,是不是用typedef的方式把int設別名成time_t。例如:

typedef int time_t;

我不確定time_t是不是int型態,或者它是別的型態,這問題困擾我

很久了,請大家幫幫忙,提供高點數20點。如果能提供是哪個檔定

義time_t的更好。

還有另一個是s_size型態,幫幫忙吧!

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    time (不是 time_t)有準度的問題!

    隨著時代的進步,對 time 的要求也有不同!

    所以,不同的 compiler 針對不同的 CPU ,對 time_t 會有不同的定義!

    所以,有的是把 long 定給了 time_t,有的是用 long long。

    (int 在 32 bits 的 CPU 等於 long)

    所以,不要用 int 代替 time_t!

    time_t 是在 time.h 裡定義的。

    s_size 不是標準的東東!

    你是不是要問 size_t?

    size_t 是 unsigned int。

    (會不會像 time_t 一樣會有 unsigned long long 版就不知道了。)

    它是在 stddef.h 裡定義

    其它如 stdio.h, stdlib.h, string.h, alloc.h, mem.h, crtdef.h 裡,

    理論上是由它 #include <stddef.h> 來的!

    但,不同的 compiler 可能有不同的做法。

    不管是 time_t 還是 size_t,它們都是標準 C 中有定義的。

    就算你知道它是 unsigned,不太建議你用 unsigned 代替它!

    2008-05-22 09:44:24 補充:

    多數情況,不用知道它真正的型別!

    多數情況,你可以把它轉型成 int。

    真的要知道,可以用 sizeof( )

    相信我,真的要知道它才能跑的情況不多!

    下面是個例外!要知道,才〝好〞跑!

    time_t t;

    t = clock( );

    // 要被測時的程式

    t = clock( ) - t;

    printf("這程式用 %d 微秒跑完,程式名 %s", t, argv[0]);

    試試看,它通常掛了!

    你會解決吧!?

    不會的話再問,我再公佈答案!^_^

    2008-05-24 09:51:51 補充:

    不好意思,我的錯!

    請把 clock( ) 改成 time(NULL)

    應該會掛!

    2008-05-24 22:23:36 補充:

    Dev C 不會掛,TC 和 VC 會! @.@

    原因在 time_t (及 int) 的 型別/大小!

    %d 是給 int 用的,time_t 在

     TC / Dev C 是 long,4 bytes

     VC 則是 int_64,是 8 bytes!

    註:另有 time64_t,使用方法 VC/ DevC不同。TC 沒有 time32_t / time64_t。

    VC 判斷你的機器的情況,自動選 time_t 為 time32_t 或 time64_t;DevC 不做這雞婆的事!

    2008-05-24 22:23:59 補充:

    現代多數的機器是 32 bits,int 就是 long,所以DevC沒事!

    VC在多數的機器會自動選 time64_t 為 time_t!所以有事!

    Turbo C 是給 16 bits 的電腦跑的! int 的是 16 bits!

    而 time_t 是 long,差了 2 bytes!

    因此,在 VC,%d 從 t 的位置取走了 4 bytes,

    留下了 t 的 4 bytes 沒取走。

    而,%s 拿了 t 的後 4 bytes 當字串位置,

    結果,印出不是程式名的字串(或 NULL)。

    2008-05-24 22:24:21 補充:

    解決方法:

    0. 把印 time_t 的放到最後面!(治標)

    1. 把印 time_t 的單獨寫一個 printf!(治標)

    2. 在 TC 用 %ld 印 time_t,在 VSC 用 %lld 印 time_t!(治本!)

    法 2. 雖然治本,但最好不要寫死,看是用 if (sizeof(time_t)) 去做,或用 轉型!

    兩者各有優缺點,看程式需求囉!

    2008-05-31 02:25:52 補充:

    time_t 的定義是 1/1/1970 起,到現在是幾秒。

    而這會有個問題:

    2^31 = 2147483648 (time_t 是 long,所是少 1 bit)

    除以 86400 秒 = 24855.13481(481循環)天

    再除 365.2422 = 68.051103664403551437415541837211年 = 68 年 18 天 15小時...

    (這中間多次的天文秒數修正,再算下去沒意義)

    可知,1 / 18 / 2038 時,用 time_t 的程式,會有類似千禧蟲的問題!!!

    才再不到 30年!!

    2008-05-31 02:26:52 補充:

    所以,若要您的程式在 1 / 18 / 2038 年時還能再正確使用,

    請在能用 time64_t 的情況下,使用 time64_t

    2008-05-31 02:28:36 補充:

    http://www.phpbbserver.com/graphicsparalle/viewtop...

    有合法且免費的 VC,可以下載來試試。

    2008-05-31 09:29:50 補充:

    有準度問題的是 clock_t, 不是 time_t

  • 丸子
    Lv 4
    1 decade ago

    測試沒有掛阿.....=_=

    2008-05-26 14:37:54 補充:

    測了DevC, gcc Unix,Linux平台上測試都正常說...觀察stddef.h及time.h定義 time_t size都是 long, 因為沒有裝VC所以無法得知測試結果....QQ

    反正先記起來再說...= =+

Still have questions? Get your answers by asking now.