一个简单的需求,就是需要程序判断当前系统的时间是不是在程序编译之后的,如果系统当前时间在编译之前,那说明这台机器的时间是不正确的,需要终止程序运行。

因为要在程序编译时候获取时间,如果每次编译前手动修改的话,稍微显得麻烦了一点。

Windows下VS2015

VC中可以使用Visual c + + 编译器预定义的宏来获取编译时间,有__DATE__ __TIME__(这两个是ISO C99 和 ISO C + + 14 标准预定义的宏)__TIMESTAMP__(这个是VS预定义的)三个宏可以获取,但是获取到的是字符串形式的时间,所以不太利于进行比较。

这里写一个函数,用来获取编译时候的时间。

// 获取编译时间
VOID GetCompileTime(LPSYSTEMTIME lpCompileTime)
{
char Mmm[4] = "Jan";
sscanf_s(__DATE__, "%3s %hu %hu", Mmm,sizeof(Mmm),
&lpCompileTime->wDay, &lpCompileTime->wYear);
Mmm[3] = Mmm[2]; Mmm[2] = Mmm[0]; Mmm[0] = Mmm[3]; Mmm[3] = 0; switch (*(DWORD*)Mmm) {
case (DWORD)('Jan'): lpCompileTime->wMonth = 1; break;
case (DWORD)('Feb'): lpCompileTime->wMonth = 2; break;
case (DWORD)('Mar'): lpCompileTime->wMonth = 3; break;
case (DWORD)('Apr'): lpCompileTime->wMonth = 4; break;
case (DWORD)('May'): lpCompileTime->wMonth = 5; break;
case (DWORD)('Jun'): lpCompileTime->wMonth = 6; break;
case (DWORD)('Jul'): lpCompileTime->wMonth = 7; break;
case (DWORD)('Aug'): lpCompileTime->wMonth = 8; break;
case (DWORD)('Sep'): lpCompileTime->wMonth = 9; break;
case (DWORD)('Oct'): lpCompileTime->wMonth = 10; break;
case (DWORD)('Nov'): lpCompileTime->wMonth = 11; break;
case (DWORD)('Dec'): lpCompileTime->wMonth = 12; break;
default:lpCompileTime->wMonth = 0;
}
sscanf_s(__TIME__, "%hu:%hu:%hu", &lpCompileTime->wHour,
&lpCompileTime->wMinute, &lpCompileTime->wSecond);
lpCompileTime->wDayOfWeek = lpCompileTime->wMilliseconds = 0;
}

因为编译器给出的时间实际上是本地时间,所以这里如果进行判断的话,可以与GetLocalTime的结果进行比较。

	SYSTEMTIME lt, ct;
GetLocalTime(&lt);
GetCompileTime(&ct); FILETIME flt, fct;
SystemTimeToFileTime(&lt, &flt);
SystemTimeToFileTime(&ct, &fct); if (flt.dwHighDateTime < fct.dwHighDateTime ||
(flt.dwHighDateTime == fct.dwHighDateTime && flt.dwLowDateTime < fct.dwLowDateTime)) {
// Todo
}

这里没有考虑不同时区的问题。

Clang或GCC

Clang和GCC下可以使用__DATE____TIME__宏来获取编译时间,这两个在多字节字符常量上与VS的处理有些不同。不多说,直接放代码。

void GetCompileTime(struct tm* lpCompileTime)
{
char Mmm[4] = "Jan";
sscanf(__DATE__, "%3s %d %d", Mmm,
&lpCompileTime->tm_mday, &lpCompileTime->tm_year);
lpCompileTime->tm_year -= 1900; switch (*(uint32_t*)Mmm) {
case (uint32_t)('Jan'): lpCompileTime->tm_mon = 1; break;
case (uint32_t)('Feb'): lpCompileTime->tm_mon = 2; break;
case (uint32_t)('Mar'): lpCompileTime->tm_mon = 3; break;
case (uint32_t)('Apr'): lpCompileTime->tm_mon = 4; break;
case (uint32_t)('May'): lpCompileTime->tm_mon = 5; break;
case (uint32_t)('Jun'): lpCompileTime->tm_mon = 6; break;
case (uint32_t)('Jul'): lpCompileTime->tm_mon = 7; break;
case (uint32_t)('Aug'): lpCompileTime->tm_mon = 8; break;
case (uint32_t)('Sep'): lpCompileTime->tm_mon = 9; break;
case (uint32_t)('Oct'): lpCompileTime->tm_mon = 10; break;
case (uint32_t)('Nov'): lpCompileTime->tm_mon = 11; break;
case (uint32_t)('Dec'): lpCompileTime->tm_mon = 12; break;
default:lpCompileTime->tm_mon = 0;
}
sscanf(__TIME__, "%d:%d:%d", &lpCompileTime->tm_hour,
&lpCompileTime->tm_min, &lpCompileTime->tm_sec);
lpCompileTime->tm_isdst = lpCompileTime->tm_wday = lpCompileTime->tm_yday = 0;
}

C++ 获取程序编译时间的更多相关文章

  1. 代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?

    代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值? 解决:通过vs的预先生成命令中,添加批处理命令,删除对应的obj文件方式,强制 ...

  2. C#获取程序集自动增加的版本号和编译时间

    1. 首先找到文件AssemblyInfo.cs, 路径如下: 2. 修改版本的格式,修改后,程序每次编译,程序集的版本号都会自增. 修改前: [assembly: AssemblyVersion(& ...

  3. 微信小程序编译包的获取与解压——在手机中获取小程序编译包wxapkg

    准备工作: 微信关注需要下载编译包的小程序,然后点进去看一下,微信就会自动下载相应的编译包到手机上了. 获取小程序编译包: 据说root手机可以直接在手机的文件管理中查找wxapkg文件,自己尝试了下 ...

  4. C#获取程序集的版本号和最后编译时间

    C#获取程序集的版本号:string ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToStrin ...

  5. 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间

    打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多, ...

  6. UNIX网络编程卷1 时间获取程序server TCP 协议相关性

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 最初代码:  这是一个简单的时间获取server程序.它和时间获取程序client一道工作. ...

  7. python3打印当前时间和获取程序运行时间

    学习使用time模块和datetime模块. 通常我们想让程序等待几秒钟,再继续向下运行,time模块的sleep()方法是一个很好的选择.但是想通过time模块打印系统的当前时间,则比较麻烦.如下: ...

  8. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

  9. Chromium源码系列一:Chromium简介及源代码获取和编译

    Chromium源码系列一:Chromium简介及源代码获取和编译 Chromium简介 ​ Chromium是一个由Google主导开发的网页浏览器,以BSD许可证等多重自由版权发行并开放源代码.C ...

随机推荐

  1. [转] HTML5应用之文件上传

    HTML5解决了以往网页编写的一个难题:带有上传进度的文件上传. 本文的代码全部来自http://www.matlus.com/html5-file-upload-with-progress/,如在技 ...

  2. [转] Anaconda使用总结

    机器上的不同用户完全可以安装.配置自己的Anaconda,不会互相影响. 对于Mac.Linux系统,Anaconda安装好后,实际上就是在主目录下多了个文件夹(~/anaconda)而已,Windo ...

  3. java集合进行排序的两种方式

    java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list) Collections.sort(List list,Compara ...

  4. 伪类target实现纯css模态框

    今天看到一个纯css模态框,觉得是很牛呀 看了下用了target伪类, 一直不知道有这么神奇的伪类 .. 用法是这样的,给模态框一个id, <div id="pop" cla ...

  5. 注册表键值明明存在OpenSubKey始终返回null,解决方案

    先上代码及实例 RegistryKey rsg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Macromedia\FlashPaper Pri ...

  6. 【Java】 剑指offer(17) 在O(1)时间删除链表结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除 ...

  7. IntelliJ IDEA(九) :插件(转)

    最近项目比较忙,很久没有更新IDEA系列了,今天介绍一下IDEA的一些炫酷的插件,IDEA强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同. 0|11.插件的安装 打开settin ...

  8. POJ 2417 Discrete Logging BSGS

    http://poj.org/problem?id=2417 BSGS 大步小步法( baby step giant step ) sqrt( p )的复杂度求出 ( a^x ) % p = b % ...

  9. BZOJ.2118.墨墨的等式(思路 最短路Dijkstra 按余数分类)

    题目链接 题意可以看做,用\(a_1,a_2,...,a_n\),能组成多少个\([L,R]\)中的数. (40分就是个完全背包) 首先如果\(k*a_i+x\)可以组成,那么\((k+1)*a_i+ ...

  10. 洛谷.3224.[HNOI2012]永无乡(Splay启发式合并)

    题目链接 查找排名为k的数用平衡树 合并时用启发式合并,把size小的树上的所有节点插入到size大的树中,每个节点最多需要O(logn)时间 并查集维护连通关系即可 O(nlogn*insert t ...