一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)
各位看官们,大家好,上一回中咱们说的是c语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 。闲话休提,言归正转。让我们一起talk c栗子吧!
看官们,我们在第一百二十四回中介绍了c语言中的内置宏,当时介绍了常用的内置宏_line_和_file_。并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名。大家都知道,这两个内置宏经常被用来在文件中添加调试信息。因为我们写的程序难免会有错误,所以需要对程序进行调试。在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个文件中的哪一行。这样就可以快速修改程序中的错误,进而提高了工作效率。不过有些看官在调试时不满足于文件名和行数,他们还想知道与错误有关的日期和时间,这也是我们再谈内置宏的原因。
在本章回中, 我们将和大家一起看另外两个内置宏_date_和_time_。它们表示程序编译的日期和时间。接下来我们通过具体的代码来说明这两个内置宏的用法,下面是详细的代码请大家参考:
#include void func() { int len=2; while(len-- >0) { printf("sleeping ... \n"); sleep(1); } } int main() { printf("file :%s line:%d date:%s,time:%s \n",__file__,__line__,__date__,__time__); func(); printf("file :%s line:%d date:%s,time:%s \n",__file__,__line__,__date__,__time__); return 0; }
我们在代码中通过内置宏来输出当前的文件名和行号以及编译文件的日期和时间,下面是程序的运行结果,请大家参考:
file :test.c line:17 date:jun 30 2016,time:20:45:39 sleeping ... sleeping ... file :test.c line:19 date:jun 30 2016,time:20:45:39
从上面的程序运行结果中可以看到该程序的文件名、编译日期和时间。不过输出了两次,之所以这样做是为了强调_time_宏代表的是程序的编译时间,而不是程序的运行时间。大家可以看到,我们使用内置宏输出时间时,第一次是在调用func()函数之前,第二次是在调用func()函数之后,而代码中的func()函数让程序休眠了2秒。正常来说,输出的时间应该延迟两秒,但是我们两次输出的时间是相同的,这说明该方法输出的时间不是程序的运行时间,而是程序的编译时间。这也算是一种反证法吧,哈哈。
说明了这么多,这个与日期和时间有关的内置宏有什么作用呢?看官莫急,且听我给大家娓娓道来。在实际工作的时候,我们不可能一天完成某个大型程序,因此就会有多个版本的程序。如果程序出错的时候,我们能够知道是程序编译的日期和时间,就能依据程序版本的发布日期和时间推算出发生错误的版本,在一个具体的版本中查找错误,比在多个版本中查找错误要方便一些,因为这样可以缩小的查找错误的范围,进而快速找到错误发生的原因。鉴于这个原理,我们经常使用日期和时间的内置宏来确认程序的版本。
各位看官,关于再谈内置宏的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
推荐阅读
-
一起talk C栗子吧(第一百八十四回:C语言实例--在printf函数中设置输出宽度三)
-
一起talk C栗子吧(第一百九十六回:C语言实例--DIY less命令五 )
-
一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)
-
一起talk C栗子吧( 第一百四十回:C语言实例--文件操作:基于文件描述符三)
-
一起talk C栗子吧(第一百四十三回:C语言实例--文件操作:基于文件指针三)
-
一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)
-
一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)
-
一起talk C栗子吧(第一百四十一回:C语言实例--文件操作:基于文件指针一)
-
一起talk C栗子吧(第一百四十二回:C语言实例--文件操作:基于文件指针二)
-
一起talk C栗子吧(第一百六十回:C语言实例--套接字通信模型二)