本文选取linus torwards 写的一段小程序,将当前的墙上时间换算成自1970年1月1日起的秒数,来学习一般的C语言程序编写的注意事项。
问题
墙上时间 ( 年 月 日 时 分 秒 )涉及元素较多,不利于计算机进行时间计算,在操作系统内部,一般在启机时,先读出墙上时间,转换成从1970年1月1日起的秒数,保存在内存中。随着时间的流逝,此秒数依次增加。当我们再次需要墙上时间时,从秒数再换算回来。
本程序将墙上时间转换成1970年1月1日凌晨0时0分0秒起到现在的秒数。
代码注解和点评
#include<time.h>
定义了tm结构体,还有其他一些与时间相关的信息
#define MINUTE 60
#define HOUR (60 * MINUTE)
#define DAY (24 * HOUR)
#define YEAR (365 * DAY)
分别代表了1分钟的秒数,1小时的秒数,1天的秒数,1年的秒数。这些宏常量定义消除了可能的魔鬼数字,增加了代码的可读性。值得学习和借鉴。
另一方面,YEAR没有考虑到闰年,实际上闰年有366天,而不是365天。但常量定义必须是要有固定的值,所以这里也没有那么死板。后面程序中会考虑闰年的情况(先假定所有年都不是闰年,然后再加上闰年的情况)。
/* interestingly, we assume leap-years */
static int month[12] = {
0,
DAY*(31),
DAY*(31+29),
DAY*(31+29+31