VC使用编译时间作为版本号标识的方法

yizhihongxing

使用编译时间作为版本号标识的方法可以在软件版本变化时,方便的追踪和定位问题。下面是详细的攻略:

1. 在VC中设置编译时间宏

在VC的项目属性中,我们可以通过设置一个宏来获取编译时间。具体操作方法如下:

  1. 打开VC项目,右键单击项目,选择“属性”。
  2. 在左侧窗格中,选择“配置属性”->“C / C++”->“预处理器”。
  3. 在“预处理器定义”下,点击“编辑”,在弹出的编辑器中,添加以下代码:
COMPILE_TIME=__TIME__
  1. 点击“应用”和“确定”保存设置。

这样,我们就定义了一个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技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PowerShell时间记录脚本

    关于“PowerShell时间记录脚本”的完整攻略,我可以为您进行详细讲解。 简介 首先,让我们来了解一下“PowerShell时间记录脚本”的简介。该脚本可以帮助用户记录电脑运行的时间,并输出到指定的文本文件中。用户可以使用该脚本来记录自己在电脑上的时间消耗,从而更好地管理时间和提高工作效率。 前置条件 在运行“PowerShell时间记录脚本”之前,用户…

    C 2023年5月22日
    00
  • 用C语言实现三子棋

    下面我将详细讲解如何用C语言实现三子棋游戏。 实现思路 三子棋游戏是一款非常经典的井字棋类游戏,实现起来并不复杂。游戏的基本规则是:先手方执“X”,后手方执“O”,两人交替落子,先将三个同色棋子排成一行、一列或一对角线的一方获胜。 为了实现三子棋游戏,我们需要按照如下步骤进行: 绘制棋盘 判断游戏是否结束 获取玩家输入 判断输入是否合法 落子并更新棋盘 判断…

    C 2023年5月23日
    00
  • 如何在C++中实现一个正确的时间循环器详解

    如何在C++中实现一个正确的时间循环器 什么是时间循环器 时间循环器是一种计时器,它按照一定的时间间隔来触发事件。在游戏编程中,时间循环器经常被用来控制游戏的逻辑,例如更新游戏物体的位置、判断游戏事件是否发生等。 实现思路 实现一个时间循环器的关键在于利用计时器并按照一定的时间间隔来触发事件。这个过程可以通过以下步骤来完成。 获取时间戳,记录当前时间。 使用…

    C 2023年5月23日
    00
  • C语言控制台实现打飞机小游戏

    下面是详细讲解“C语言控制台实现打飞机小游戏”的完整攻略: 简介 打飞机小游戏相信大家都玩过,这是一款基础却充满趣味的小游戏,在许多游戏平台上都有此游戏的复刻版本。现在,我们来学习使用C语言控制台实现打飞机小游戏的过程,不仅能增加我们C语言的实战经验,也能更好地理解和掌握C语言的基本语法。 实现步骤 下面介绍C语言控制台实现打飞机小游戏的实现步骤: 安装图形…

    C 2023年5月22日
    00
  • PHP错误处理函数

    当 PHP 程序出错时,可以通过使用 PHP 错误处理机制来捕获并处理错误,PHP 为我们提供了一系列的错误处理函数来实现这一功能: 错误类型 PHP 内置了多种类型的错误,下面来简单介绍一下: E_ERROR 表示严重的错误,程序无法恢复运行,例如访问一个不存在的方法或函数 E_WARNING 表示警告信息,程序可以继续运行,但可能出现问题,例如访问一个未…

    C 2023年5月23日
    00
  • Linux之时钟中断详解

    Linux之时钟中断详解 什么是时钟中断 时钟中断是Linux系统内核所提供的一种基本的系统管理机制。正是因为有了时钟中断这种机制,操作系统才能够在执行任务的同时,不断地监视硬件设备的状态、处理软件信号、轮流调度所有的进程等等。 时钟中断是一个定时器机制。当时钟中断的计数器达到设定值时,就会触发一个中断,将控制权交给内核去处理中断事件。在Linux系统中,时…

    C 2023年5月22日
    00
  • Golang使用Gin创建Restful API的实现

    下面我将详细讲解如何使用Golang编写Gin框架的Restful API。 目录 前置条件 创建Gin应用 实现Restful API 示例说明 总结 1. 前置条件 在开始编写代码之前,需要先安装好Golang和Gin框架。可以在 golang官网 上下载和安装Golang,然后使用以下命令安装Gin框架: go get -u github.com/gi…

    C 2023年5月23日
    00
  • C语言如何正确的终止正在运行的子线程

    在C语言中,终止正在运行的子线程有两种常用方法:一种是让线程函数正常返回;另一种是使用pthread_cancel函数强制终止线程。我们来分别介绍这两种方法的具体实现。 方法一 让子线程函数正常返回,从而终止子线程的执行。这种方式需要在线程函数中判断是否需要退出,并在需要退出时,将线程函数的返回值设为0。线程启动时,使用pthread_create函数创建线…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部