使用编译时间作为版本号标识的方法可以在软件版本变化时,方便的追踪和定位问题。下面是详细的攻略:
1. 在VC中设置编译时间宏
在VC的项目属性中,我们可以通过设置一个宏来获取编译时间。具体操作方法如下:
- 打开VC项目,右键单击项目,选择“属性”。
- 在左侧窗格中,选择“配置属性”->“C / C++”->“预处理器”。
- 在“预处理器定义”下,点击“编辑”,在弹出的编辑器中,添加以下代码:
COMPILE_TIME=__TIME__
- 点击“应用”和“确定”保存设置。
这样,我们就定义了一个COMPILE_TIME宏,它的值是编译时间,格式为“hh:mm:ss”。
2. 定义版本号
根据我们的要求,采用编译时间作为版本号标识,我们需要将编译时间转换成数字格式,并将其作为版本号。假设我们的版本号格式为“年.月.日.时.分”,那么可以这样转换:
#define COMPILE_TIME_NUM ((((__TIME__[0]-'0')*10+(__TIME__[1]-'0'))*60+((__TIME__[3]-'0')*10+(__TIME__[4]-'0')))*60+(__TIME__[6]-'0')*10+(__TIME__[7]-'0'))
#define VERSION_NUM (__DATE__[9]-'0'+(__DATE__[8]==' '?0:((__DATE__[8]-'0')*10))*10)*1000000+(__DATE__[1]==' '?0:((__DATE__[0]-'0')*10)+(__DATE__[1]-'0'))*10000+(__DATE__[4]==' '?0:((__DATE__[3]-'0')*10)+(__DATE__[4]-'0'))*100+((COMPILE_TIME_NUM/3600)%24)*100+(COMPILE_TIME_NUM/60)%60
这里定义了两个宏,COMPILE_TIME_NUM用来将编译时间转换成数字格式,VERSION_NUM用来定义版本号。
3. 在代码中使用版本号
在代码中使用定义的宏,即可使用编译时间作为版本号标识。例如:
printf("Version: %d.%d.%d.%d.%d\n", VERSION_NUM/1000000, (VERSION_NUM/10000)%100, (VERSION_NUM/100)%100, VERSION_NUM%100, COMPILE_TIME_NUM);
这样,我们就可以在每次编译时,自动更新版本号,方便追踪和定位问题。下面是两个示例,分别演示在控制台应用和Windows应用中如何使用。
示例1:控制台应用
#include <stdio.h>
#define COMPILE_TIME=__TIME__
#define COMPILE_TIME_NUM ((((__TIME__[0]-'0')*10+(__TIME__[1]-'0'))*60+((__TIME__[3]-'0')*10+(__TIME__[4]-'0')))*60+(__TIME__[6]-'0')*10+(__TIME__[7]-'0'))
#define VERSION_NUM (__DATE__[9]-'0'+(__DATE__[8]==' '?0:((__DATE__[8]-'0')*10))*10)*1000000+(__DATE__[1]==' '?0:((__DATE__[0]-'0')*10)+(__DATE__[1]-'0'))*10000+(__DATE__[4]==' '?0:((__DATE__[3]-'0')*10)+(__DATE__[4]-'0'))*100+((COMPILE_TIME_NUM/3600)%24)*100+(COMPILE_TIME_NUM/60)%60
int main()
{
printf("Version: %d.%d.%d.%d.%d\n",
VERSION_NUM/1000000,
(VERSION_NUM/10000)%100,
(VERSION_NUM/100)%100,
VERSION_NUM%100,
COMPILE_TIME_NUM
);
return 0;
}
示例2:Windows应用
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define COMPILE_TIME=__TIME__
#define COMPILE_TIME_NUM ((((__TIME__[0]-'0')*10+(__TIME__[1]-'0'))*60+((__TIME__[3]-'0')*10+(__TIME__[4]-'0')))*60+(__TIME__[6]-'0')*10+(__TIME__[7]-'0'))
#define VERSION_NUM (__DATE__[9]-'0'+(__DATE__[8]==' '?0:((__DATE__[8]-'0')*10))*10)*1000000+(__DATE__[1]==' '?0:((__DATE__[0]-'0')*10)+(__DATE__[1]-'0'))*10000+(__DATE__[4]==' '?0:((__DATE__[3]-'0')*10)+(__DATE__[4]-'0'))*100+((COMPILE_TIME_NUM/3600)%24)*100+(COMPILE_TIME_NUM/60)%60
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
TCHAR szClassName[] = _T("MyWindowClass");
TCHAR szTitle[] = _T("Windows App Version Demo");
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if( !RegisterClass(&wndclass) )
{
MessageBox(NULL, _T("注册窗口类错误!"), szTitle, MB_ICONERROR);
return 0;
}
HWND hWnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if( !hWnd )
{
MessageBox(NULL, _T("创建窗口错误!"), szTitle, MB_ICONERROR);
return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message )
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
TCHAR szText[50];
_stprintf_s(szText, 50, _T("Version: %d.%d.%d.%d.%d"),
VERSION_NUM/1000000,
(VERSION_NUM/10000)%100,
(VERSION_NUM/100)%100,
VERSION_NUM%100,
COMPILE_TIME_NUM
);
TextOut(hdc, 10, 10, szText, _tcslen(szText));
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VC使用编译时间作为版本号标识的方法 - Python技术站