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(&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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM