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

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

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日

相关文章

  • C语言实现猜数游戏

    C语言实现猜数游戏攻略 一、简介 C语言实现猜数游戏是一种比较简单的小项目,它可以帮助初学C语言的程序员更好地理解C语言的基本语法,提升程序设计能力。本攻略将介绍实现猜数游戏的完整过程,并提供两个示例。 二、游戏规则 猜数游戏的规则非常简单,程序先生成一个1~100之间的随机整数,玩家需要在规定的次数内猜出这个数字。每次猜数后,程序会根据玩家的猜测结果给出提…

    C 2023年5月23日
    00
  • Python常见读写文件操作实例总结【文本、json、csv、pdf等】

    Python常见读写文件操作实例总结 本文将介绍在Python中针对常见文件类型的读写操作,包括文本、JSON、CSV以及PDF等格式。 文本文件读写 读取文本文件 读取文本文件很简单,可以使用Python内置的open()函数来打开文件,然后读取文件的内容。open()函数接收两个参数,第一个参数是要读取的文件的路径,第二个参数是打开文件的模式,我们这里使…

    C 2023年5月23日
    00
  • vs2019中使用MFC构建简单windows窗口程序

    下面我将详细讲解如何在VS2019中使用MFC构建简单的windows窗口程序。 1. 准备工作 首先,我们需要安装Microsoft Visual Studio 2019,并选择安装C++桌面开发组件中的MFC组件。 2. 创建MFC应用程序 在VS2019中打开,选择“创建新项目”,然后在左侧选中“Visual C++”,在右侧选中“MFC应用程序”,并…

    C 2023年5月30日
    00
  • C语言中函数的声明、定义及使用的入门教程

    C语言中的函数是一个被组织起来的代码块,它被设计为提供一些基本的功能操作,能够完成一些特定的任务。在C语言中,函数的使用广泛,因此我们需要学会函数的声明、定义及使用。 1. 函数的声明 函数的声明是指向编译器通知函数的返回类型、函数名和参数列表。函数的声明语法如下: 返回值类型 函数名(参数列表); 其中,返回值类型是指函数执行后返回的结果类型,它可以是任意…

    C 2023年5月23日
    00
  • C++ 内存分配处理函数set_new_handler的使用

    当C++程序在运行时发现内存分配失败时,会抛出一个std::bad_alloc异常。为了避免程序崩溃,我们可以使用set_new_handler函数来注册一个新的处理函数,当内存分配失败时,程序会调用该函数来处理内存分配失败的情况。 set_new_handler函数的语法 set_new_handler函数是一个全局函数,它的原型如下: std::new_…

    C 2023年5月23日
    00
  • C语言 详细讲解逻辑运算符的使用

    C语言 详细讲解逻辑运算符的使用 在C语言中,逻辑运算符用来比较两个条件语句的关系,并返回True或False。 C语言中的逻辑运算符有三种,分别是 &&(逻辑与)、||(逻辑或)和!(逻辑非)。 逻辑与(&&) 逻辑与用于判断两个条件语句是否同时为真,如果两个条件语句都为真,则返回True,否则返回False。 逻辑与的使用…

    C 2023年5月23日
    00
  • QT5连接MySQL实现增删改查

    下面就是QT5连接MySQL实现增删改查的完整攻略。 1. 安装MySQL驱动 在QT5中连接MySQL必须要安装MySQL驱动,你可以从以下链接中下载:https://www.mysql.com/products/connector/ 将下载好的驱动放在QT5安装目录下的plugins/sqldrivers目录下。 2. 配置项目文件 在.pro文件中添加…

    C 2023年5月23日
    00
  • gdb调试命令的使用及总结

    GDB调试命令的使用及总结 简介 GDB是一个功能强大的调试工具,可以用于调试C程序等各种编程语言。 它可以帮助程序员查找程序崩溃、调查内存问题、跟踪函数调用等问题。 本文旨在提供一些GDB常用调试命令的示例及使用方法,以便于程序员快速定位程序的问题。 命令列表 下面是一些常用的GDB调试命令的列表。 常用命令 命令 描述 run 运行程序 break [f…

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