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 ...
随机推荐
- Ext.js项目(一)
这个项目整体采用代码生成器生成,具体看下图:
- 【BZOJ4773】负环 [SPFA][二分]
负环 Time Limit: 100 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在忘记考虑负环之后,黎瑟的算法又出错 ...
- 使用.NET Core+Docker 开发微服务
.NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜, ...
- Docker 注意事项
一.Dockerfile名字不能是大写. 二.Docker-compares 引用自:https://www.cnblogs.com/wj5633/p/6707012.html 引用自:https:/ ...
- 【Java】 剑指offer(62) 圆圈中最后剩下的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每 ...
- django基类View.as_view()
参考:https://www.zmrenwu.com/post/53/ 详细见参考 一般请求的判断方法: def view(request, *args, **kwargs): if request. ...
- 不一样的go语言之入门篇-Hello World
这是<不一样的go语言>的开篇之作,我尝试以java语言转变者的角度来聊一聊go语言.所以今天先从go语言的基础开始,即语法. 学习一门新的编程语言,必从语法开始.但需要注意的是, ...
- UC浏览器中Ajax请求中传递数据的一个坑
今天突然收到一个bug,有用户在其浏览器环境中一直无法提交内容,使用的是UC浏览器.当换成Chrome时,内容能够正常提交.鉴于本地没有一直使用Firefox 以及Chrome,于是去下载了一个UC ...
- Bzoj4480: [Jsoi2013]快乐的jyy 广义后缀自动机 倍增 哈希 manacher
国际惯例的题面:有人说这是回文自动机的板子题,然而我是不会这种东西的.于是,我选择用更一般性的方法去解决这个题,就是那一堆东西了.首先,我们把两个串同时插入一个广义SAM里,拓扑排序维护每个节点的pa ...
- BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位
题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...