背景故事:我有一个时间转换问题,我试图解决这个问题。我正在开发的程序使用内部日期表示。日期表示为自 2000/01/01 以来的秒数。这个数字在程序中是恒定的。我的猜测是,它不应该是,因为这个数字可能取决于时区。
我做了一个简单的程序,以测试自 2000/01/01 的 unix 纪元开始以来的秒数是否在不同的机器上有所不同:
struct tm tm_date;
time_t t_LongDate;
tm_date.tm_year = 2000 - 1900;
tm_date.tm_mon = 1 - 1;
tm_date.tm_mday = 1;
tm_date.tm_hour = 0;
tm_date.tm_min = 0;
tm_date.tm_sec = 0;
t_LongDate = mktime(&tm_date);
printf("result: %lld\n", (long long)t_LongDate);
return 0;
我在我的开发机器上编译了程序,它似乎可以工作:
result: 946681200
然后我将二进制文件上传到有问题的主机。这反驳了我的假设。秒数是一样的:
problematic-host# ./a.out
result: 946681200
因为我是一个可疑的人,所以我尝试在有问题的主机上重新编译程序。没想到太多,但是:
problematic-host# gcc secSinceEpoch.c
problematic-host# ./a.out
result: 946677600
正如我最初预期的那样 - 有一个小时的差异。但是发生了什么?GCC 是否优化了我的小程序以仅输出一个恒定值,因为它不依赖于任何用户输入或随机源?它会在我真正的大程序中做同样的事情吗?有什么方法可以强制它实际运行这些功能吗?