c++实现一个比较两个string类型的版本号的小demo

本文详细解析如何通过字符串解析版本号并实现版本比较功能,适用于软件更新模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在软件实现更新模块的时候,有可能会判断一下服务器上的版本的版本号和本地版本的版本号。

下面有类似这样形式的版本号:string str = "0.0.0.1";

分析一下可以看出,该版本号可以分为4个部分,下面就实现一个提取这4部分的功能函数:

 1 //通过string 参数获取版本号到version数组内
 2 //该函数是通过"."来分别获取4个整形值的
 3 //所以允许出现类似: "1000.20.3.5"
 4 
 5 void GetVersion(string str,int *version)
 6 {
 7     string st1("");
 8     int j = 0;
 9     for (int i = 0;i< str.size();i++)
10     {
11         if (str[i] == '.')
12         {
13             version[j++] = atoi(st1.c_str());
14             st1 = "";
15         }else
16         {
17             st1 += str[i];
18         }
19     }
20     version[j++] = atoi(st1.c_str());
21 }
22 
23 //////////////////////////////////////////////////////////////////////
24 
25 string strServerListVersion = "0.0.0.2 ";//服务器版本的版本号
26 string strLocVersion = " 0.0.0.1";//本地版本的版本号
27 int serverVersion[4] = {0};
28 int locVersion[4] = {0};
29 
30 
31 GetVersion(strServerListVersion ,serverVersion);
32 
33 GetVersion(strLocVersion ,locVersion);
34 
35 
36 //比较两个版本
37 int k = memcmp(locVersion,serverVersion,4);
38 if (k == 0)
39 {
40    //版本相等
41             
42 }else if (k < 0)
43 {
44    //服务器版本高
45 
46 
47 }else
48 {
49    //服务器版本低
50 }

 功能不复杂,有用到类似版本号比较判断的,就可以直接拿走就可以用。

之所以把获取的4个表示版本的值放在数组内,是为了更进一步的开发,比如升降版本:从1.5一下子降到1.0

这时候就可以实现逻辑:通过数组获取版本差值,然后先从版本1.5降到1.4然后1.3然后1.2然后1.1最后才能到1.0

而不是直接就从1.5一下子将到1.0

一般更新升级的话都会调用 libbz2 使用patch的形式进行增量差分升级的,这里就不啰嗦了。

<think>好的,用户现在需要一个C++编写的OpenXR基本应用代码。之前他们问过关于创建XrInstance失败的问题,所以可能已经有一定的OpenXR开发经验,但遇到了问题。现在他们可能想要一个简单的示例代码来参考,确保他们的基础结构正确。 首先,我需要确定用户的需求是什么。他们可能想要一个能够初始化OpenXR实例、检查扩展和视图配置,并正确清理资源的示例。这可能包括创建实例、系统、会话等基本步骤。同时,用户可能希望代码结构清晰,注释详细,方便他们理解每一步的作用,以便排查之前遇到的问题。 接下来,我需要考虑用户可能的开发环境。OpenXR支持多平台,但示例代码可能需要针对不同平台进行调整。用户可能使用的是Windows或Linux,所以代码应该尽量保持平台无关,或者注明平台特定的部分,比如Windows的图形API选择。此外,用户可能已经安装了OpenXR SDK和相应的运行时,如Oculus或SteamVR,所以代码中需要包含必要的头文件和库引用。 然后,我需要确保代码符合OpenXR的最佳实践。比如,正确初始化结构体,设置类型信息,检查返回结果,以及资源的释放。用户之前遇到XrInstance创建失败的问题,可能在参数填充或运行时环境上有问题,因此示例代码需要展示正确的初始化流程,并强调关键步骤,如设置applicationInfo的版本号,检查API层和扩展的支持情况。 另外,用户可能需要了解如何调试和验证他们的代码。因此,在示例中加入错误处理代码,比如使用xrResultToString来获取错误信息,以及启用调试层可能会有帮助。同时,提供编译命令和验证步骤可以让用户更容易测试代码,确认是否正常运行。 我还需要考虑代码的完整性。示例应该包括创建实例、系统、会话,处理事件循环,以及清理资源。虽然是一个基本应用,但需要覆盖主要步骤,让用户了解整个流程。此外,用户可能对图形渲染部分感兴趣,但OpenXR本身不处理渲染,所以需要说明如何与Vulkan或OpenGL集成,或者至少获取视图配置信息。 最后,要确保代码简洁,避免不必要的复杂性。用户需要一个基础的框架,可能之后会在此之上添加功能。因此,示例应保持简单,突出OpenXR的核心步骤,如实例创建和销毁,系统获取,会话管理,以及事件处理。同时,注释和文档说明可以帮助用户理解每个部分的作用,以及可能出现的常见问题和解决方案。</think>以下是一个简化的 OpenXR C++ 基本应用框架,包含关键步骤和错误处理: ```cpp #include <openxr/openxr.h> #include <iostream> #include <vector> // 错误检查宏 #define XR_CHECK(res) if (XR_FAILED(res)) { \ char buf[XR_MAX_RESULT_STRING_SIZE]; \ xrResultToString(XR_NULL_HANDLE, res, buf); \ std::cerr << "OpenXR Error: " << buf << " (" << res << ")" << std::endl; \ exit(1); } int main() { // 1. 创建 XrInstance XrInstance instance = XR_NULL_HANDLE; { XrInstanceCreateInfo createInfo{ XR_TYPE_INSTANCE_CREATE_INFO }; strcpy(createInfo.applicationInfo.applicationName, "OpenXR Demo"); createInfo.applicationInfo.applicationVersion = 1; createInfo.applicationInfo.apiVersion = XR_CURRENT_API_VERSION; // 启用调试层(开发时建议开启) const char* layers[] = { "XR_APILAYER_LUNARG_core_validation" }; createInfo.enabledApiLayerCount = 1; createInfo.enabledApiLayerNames = layers; XrResult res = xrCreateInstance(&createInfo, &instance); XR_CHECK(res); } // 2. 获取系统信息 XrSystemId systemId = XR_NULL_SYSTEM_ID; { XrSystemGetInfo systemInfo{ XR_TYPE_SYSTEM_GET_INFO }; systemInfo.formFactor = XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY; XrResult res = xrGetSystem(instance, &systemInfo, &systemId); XR_CHECK(res); } // 3. 检查视图配置 { uint32_t viewCount; xrEnumerateViewConfigurations(instance, systemId, 0, &viewCount, nullptr); std::vector<XrViewConfigurationType> viewTypes(viewCount); xrEnumerateViewConfigurations(instance, systemId, viewCount, &viewCount, viewTypes.data()); std::cout << "Supported view configurations: "; for (auto type : viewTypes) { std::cout << type << " "; } std::cout << std::endl; } // 4. 创建会话(需要图形API绑定,此处为框架代码) XrSession session = XR_NULL_HANDLE; { XrSessionCreateInfo createInfo{ XR_TYPE_SESSION_CREATE_INFO }; // 实际开发需设置图形绑定(如Vulkan/OpenGL) createInfo.systemId = systemId; XrResult res = xrCreateSession(instance, &createInfo, &session); XR_CHECK(res); } // 5. 主循环框架 bool running = true; while (running) { XrEventDataBuffer event{ XR_TYPE_EVENT_DATA_BUFFER }; while (xrPollEvent(instance, &event) == XR_SUCCESS) { switch (event.type) { case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED: { auto* state = reinterpret_cast<XrEventDataSessionStateChanged*>(&event); if (state->state == XR_SESSION_STATE_STOPPING) { running = false; } break; } // 处理其他事件... } event = { XR_TYPE_EVENT_DATA_BUFFER }; } } // 6. 清理资源 if (session != XR_NULL_HANDLE) { xrDestroySession(session); } if (instance != XR_NULL_HANDLE) { xrDestroyInstance(instance); } return 0; } ``` --- ### **关键功能说明** 1. **实例创建** - 显式设置 `XrInstanceCreateInfo::type` - 启用核心验证层(开发阶段建议开启) - 应用版本号必须大于 0 2. **图形API集成** - 实际开发需补充图形绑定(示例代码中留空) - 例如 Vulkan 绑定: ```cpp XrGraphicsBindingVulkanKHR vulkanBinding{}; createInfo.next = &vulkanBinding; ``` 3. **事件处理**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值