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/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理