MSVCとgcc新旧のtime
まずはMSVC2010:
#include <time.h> #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { printf("sizeof(int):%d\n", sizeof(int)); printf("sizeof(long):%d\n", sizeof(long)); printf("sizeof(time_t):%d\n", sizeof(time_t)); return 0; }
sizeof(int):4
sizeof(long):4
sizeof(time_t):8
続行するには何かキーを押してください . . .
time_tは8バイトある。
MinGW32のgccのtime.hでも、__time64_t, __time32_tは定義されている。
/* A 64-bit time_t to get to Y3K */ #ifndef _TIME64_T_DEFINED typedef __int64 __time64_t; #define _TIME64_T_DEFINED #endif
とか。time_tを32と64のどっちにするかが問題。
古いgccではデフォルトで32ビットのようだ。TDM-GCCでは64ビットだった。
$ g++ test.cpp -o test.exe$ ./test.exe
sizeof(int): 4
sizeof(long): 4
sizeof(time_t): 4$ tdm-g++ test.cpp -o test.exe
$ ./test.exe
sizeof(int): 4
sizeof(long): 4
sizeof(time_t): 8$
time()が返す値を見る。
$ ./test.exe
sizeof(int): 4
sizeof(long): 4
sizeof(time_t): 4
time: 1452329988$ tdm-g++ test.cpp -o test.exe
$ ./test.exe
sizeof(int): 4
sizeof(long): 4
sizeof(time_t): 8
time: 1452329992$
sizeof(int):4
sizeof(long):4
sizeof(time_t):8
time: 1452330052
続行するには何かキーを押してください . . .
現時点で、14億ナンボだ。もうしばらくは32bitでも大丈夫だろうが、早めに64bitにするのが望ましい。
対策としては、
#define TIME64_T __time64_t TIME64_T t = (TIME64_T)time(NULL);
としてから使うことにするか。