C++ 获取程序编译时间
一个简单的需求,就是需要程序判断当前系统的时间是不是在程序编译之后的,如果系统当前时间在编译之前,那说明这台机器的时间是不正确的,需要终止程序运行。
因为要在程序编译时候获取时间,如果每次编译前手动修改的话,稍微显得麻烦了一点。
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(<);
GetCompileTime(&ct);
FILETIME flt, fct;
SystemTimeToFileTime(<, &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++ 获取程序编译时间的更多相关文章
- 代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?
代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值? 解决:通过vs的预先生成命令中,添加批处理命令,删除对应的obj文件方式,强制 ...
- C#获取程序集自动增加的版本号和编译时间
1. 首先找到文件AssemblyInfo.cs, 路径如下: 2. 修改版本的格式,修改后,程序每次编译,程序集的版本号都会自增. 修改前: [assembly: AssemblyVersion(& ...
- 微信小程序编译包的获取与解压——在手机中获取小程序编译包wxapkg
准备工作: 微信关注需要下载编译包的小程序,然后点进去看一下,微信就会自动下载相应的编译包到手机上了. 获取小程序编译包: 据说root手机可以直接在手机的文件管理中查找wxapkg文件,自己尝试了下 ...
- C#获取程序集的版本号和最后编译时间
C#获取程序集的版本号:string ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToStrin ...
- 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间
打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多, ...
- UNIX网络编程卷1 时间获取程序server TCP 协议相关性
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 最初代码: 这是一个简单的时间获取server程序.它和时间获取程序client一道工作. ...
- python3打印当前时间和获取程序运行时间
学习使用time模块和datetime模块. 通常我们想让程序等待几秒钟,再继续向下运行,time模块的sleep()方法是一个很好的选择.但是想通过time模块打印系统的当前时间,则比较麻烦.如下: ...
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...
- Chromium源码系列一:Chromium简介及源代码获取和编译
Chromium源码系列一:Chromium简介及源代码获取和编译 Chromium简介 Chromium是一个由Google主导开发的网页浏览器,以BSD许可证等多重自由版权发行并开放源代码.C ...
随机推荐
- 2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析 原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或E ...
- DDD领域模型数据访问权限之用户权限(十)
BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...
- js后退
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 history.back(0) 刷新 ...
- 安装elasticsearch-7.0.0及插件
下载安装包:(下载地址:https://www.elastic.co/cn/downloads/elasticsearch)elasticsearch-7.0.0-linux-x86_64.tar.g ...
- 【Java】 剑指offer(41) 数据流中的中位数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中 ...
- Linux学习之常用网络通信命令与shell简单应用技巧(四)
(一)常用网络通信命令 (1)ping命令 (2)write命令 (3)wall命令 (4)ifconfig命令 (5)shutdown命令 (6)reboot命令 (二)shell简单应用技巧 (1 ...
- Luogu
dalao们的博客a http://hzwer.com //Orz %%% https://oi-wiki.org //Orz https://www.cnblogs.com/-guz/p/9 ...
- 模拟ajax接口返回的数据
{ "status": 0, "hasError": false, "success": true, "errno": ...
- 每日踩坑 2019-04-09 Web.config configuration 蓝色波浪线 未声明 configuration 标签的解决办法
百度看了几篇答案都没有给出解决方案,看了看 MSDN. https://docs.microsoft.com/zh-cn/previous-versions/ms228147(v=vs.110) 似乎 ...
- 5288: [Hnoi2018]游戏
5288: [Hnoi2018]游戏 链接 分析: 考虑y<=x的怎么做,那么只能从左边走到右边.我们可以从最右边的点开始,一次确定每个点往右边可以走多少. L[x],R[x]分别是x向左向右最 ...