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 ...
随机推荐
- 《剑指offer》-找到数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- DDD领域模型数据访问之对象(十一)
在工程DDD.Domain中文件夹ModelPermission新建类:BAS_Object public partial class BAS_Obejct:AggreateRoot { //仓储接口 ...
- 【C++ Primer 第15章】定义派生类析构函数
学习资料 • 基类和派生类析构函数执行顺序 定义派生类析构函数 [注意]定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数 ...
- python实现的椭圆曲线加密
我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...
- spring配置redis注解缓存
前几天在spring整合Redis的时候使用了手动的方式,也就是可以手动的向redis添加缓存与清除缓存,参考:http://www.cnblogs.com/qlqwjy/p/8562703.html ...
- BZOJ1073 [SCOI2007]kshort K短路,A*
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...
- git add Untracked files
git add * 将目录里的所有文件提交到暂存区后 git status 查看状态 所有文件都是绿色的表示本地的文件和暂存区的文件是一样的 然后在本地修改一个文件 然后新建一个文件 在使用git ...
- Linux学习之文件系统常用命令(七)
Linux文件系统常用命令 目录 df命令 du命令 fsck命令 dump2fs命令 df命令 df命令 统计文件系统的占有情况,分区用了多少空间,还剩多少空间 df [选项] [挂载点] 选项: ...
- Linux遇到的问题
一.基本命令 yum list installed | grep docker 查看yum安装了哪些软件 netstat -lnp|grep 8000 查看端口 netstat -plutn | g ...
- java 客户端调用 go grpc服务端问题总结
1.网络不通,无法调试. 2.proto文件更改后要及时通知客户端. 3.grpc跨语言调用多语言使用很方便.