超级好用的C++实用库之跨平台实用方法

💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

概述

C++跨平台开发时,我们经常会遇到一系列挑战和问题。这些问题主要源自不同操作系统和编译器之间的差异,这些差异包括但不限于以下几点。

1、不同的编译器(比如:GCC、Clang、MSVC等)对C++标准的支持程度和扩展特性存在差异,这可能导致同样的代码在不同平台上编译失败或行为不一致。

2、不同平台的系统头文件路径和库文件位置可能不同,需要通过条件编译或构建系统(比如:CMake)来进行适配。

3、Windows使用反斜杠\作为路径分隔符,而Unix-like系统使用正斜杠/。

4、不同平台的线程库和并发API有差异,这在前面的文章中已经提到过。

5、不同平台的内存对齐规则和字节序(大端或小端)可能不同,需要确保数据结构的定义和数据传输代码考虑到了这些差异。

6、动态库的命名规则、加载机制和依赖管理在不同平台上有差异,需要通过平台特定的配置来解决。

CHP_Utils

为了解决上面跨平台开发遇到的挑战和问题,我们封装了CHP_Utils类。CHP_Utils类是一个接口类,不需要实例化。因此,我们将构造函数和析构函数声明成了私有的,并提供了若干实用的静态函数。这些静态函数涵盖获取当前进程ID、获取当前线程ID、获取本地时间、获取CPU的使用率、获取内存的占用情况、获取网络的使用情况、获取磁盘目录的空间容量、字符串接口、文件路径接口等各种操作。

CHP_Utils类的头文件,可参考下面的示例代码。

#pragma once#include <time.h>
#include <string>
#include <vector>
#include <map>#ifdef _WIN32#include <WinSock2.h>#include <Pdh.h>
#endif#include "HP_Types.h"
#include "HP_Mutex.h"
#include "HP_Socket.h"#define HP_UTILS_MAX_PROCESSOR_COUNT     256#ifndef MAX_PATH#define MAX_PATH                 260
#endif#define HP_FILE_BSLASH_CHR              '\\'
#define HP_FILE_BSLASH_STR              "\\"
#define HP_FILE_SLASH_CHR               '/'
#define HP_FILE_SLASH_STR               "/"#ifdef _WIN32#define HP_FILE_PATH_SEP_CHR   HP_FILE_BSLASH_CHR#define HP_FILE_PATH_SEP_STR   HP_FILE_BSLASH_STR
#else#define HP_FILE_PATH_SEP_CHR   HP_FILE_SLASH_CHR#define HP_FILE_PATH_SEP_STR   HP_FILE_SLASH_STR
#endifclass CHP_Utils
{
public:static int GetPID();static int GetThreadSelfID();static unsigned int GetCurTick();static int GetLastErrorCode();static int GetLocalTime(time_t tmTime, struct tm &tmLocal);static int GetGmTime(time_t tmTime, struct tm &tmGm);static int GetCPULoad(unsigned int &uiCPUCount, unsigned int &uiHighestLoad);static int GetMemoryLoad(unsigned int &uiTotalMemMB, unsigned int &uiAvailMemMB);static int GetNetworkLoad(unsigned int &uiDownloadBytePerSec, unsigned int &uiUploadBytePerSec, const char *pszInterface = "eth0");static int GetDiskSpace(const char *pszDiskDir, unsigned int &uiTotalMB, unsigned int &uiFreeMB);static int GetProcessCPULoad(unsigned int &uiCPULoad);static int GetProcessMemoryLoad(unsigned int &uiMemMB, unsigned int &uiVirMemMB);static void GetDiskSerialNumber(std::vector<std::string> &vctSerialNumber);static void Sleep(unsigned int uiTimeMs);static int StrCompareIgnoreCase(const char *pszText1, const char *pszText2);static int StrCompareIgnoreCase(const std::string &strText1, const std::string &strText2);static void StrToLower(char *pszText);static void StrToLower(std::string &strText);static void StrToUpper(char *pszText);static void StrToUpper(std::string &strText);static char *StrDequote(char *pszText);static void StrDequote(std::string &strText);static int StrTrim(char *pszText, const char cTrim = ' ');static int StrTrim(std::string &strText, const char cTrim = ' ');static void StrSplitByChar(const char *pszText, std::vector<std::string> &vctSubText, const char pszSplitChar[] = ";,", bool bTrim = true, bool bIgnoreBlank = false, bool bSupportQuote = false);static void StrSplitByStr(const char *pszText, std::vector<std::string> &vctSubText,const char *pszSplitStr, bool bTrim = true, bool bIgnoreBlank = false);static void StrGetAttribValue(const char *pszText, std::string &strAttr, std::string &strValue, bool bTrim = false, bool bDequote = false);static void StrGetAttribValueMap(const char *pszText, std::map<std::string, std::string> &mapAttrToVal, bool bTrim = false, bool bSupportQuote = false, bool bDequote = false, const char *pszSplitChar = " ;,");static char *HexStrToData(const char *pszHex, char *pData);static void HexStrToData(const std::string &strHexText, std::string &strData);static char *DataToHexStr(char *pData, int nDataLen, char *pszHexStr, bool bLowerCase = false, bool bWithPrefix0x = false);static void DataToHexStr(const std::string &strData, std::string &strHexText, bool bLowerCase = false, bool bWithPrefix0x = false);static bool StrMatched(const char *pszText, const char *pszPattern);static bool IsFileExist(const char *pszFile);static bool IsDirExist(const char *pszDir);static bool IsDirEmpty(const char *pszDir);static bool IsAbsolutePath(const char *pszPath);static bool IsPathEndWithSlash(const char *pszPath);static void NormalizePath(char pszPath[MAX_PATH], const char cSeparator = HP_FILE_PATH_SEP_CHR);static void NormalizePath(std::string &strPath, const char cSeparator = HP_FILE_PATH_SEP_CHR);static void AppendPath(char pszPath[MAX_PATH], const char *pszMore, const char cSeparator = HP_FILE_PATH_SEP_CHR);static void AppendPath(std::string &strPath, const std::string &strMore,const char cSeparator = HP_FILE_PATH_SEP_CHR);static char *GetParentDirPath(char pszParentDirPath[MAX_PATH], const char *pszDirPath, const char cSeparator = HP_FILE_PATH_SEP_CHR);static void GetParentDirPath(std::string &strParentDirPath, const std::string &strDirPath, const char cSeparator = HP_FILE_PATH_SEP_CHR);static char *GetAppPathName(char pszPathName[MAX_PATH], HP_HANDLE hModule = NULL);static void GetAppPathName(std::string &strPathName, HP_HANDLE hModule = NULL);static char *GetAppOnlyPath(char pszPath[MAX_PATH], HP_HANDLE hModule = NULL);static void GetAppOnlyPath(std::string &strPath, HP_HANDLE hModule = NULL);static char *GetAppOnlyName(char pszName[MAX_PATH], HP_HANDLE hModule = NULL);static void GetAppOnlyName(std::string &strName, HP_HANDLE hModule = NULL);static char *PathNameToPath(char pszPath[MAX_PATH], const char *pszPathName,const char cSeparator = HP_FILE_PATH_SEP_CHR);static char *PathNameToName(char pszName[MAX_PATH], const char *pszPathName);static char *PathNameToNoExtName(char pszName[MAX_PATH], const char *pszPathName);static char *PathNameToExt(char pszExt[MAX_PATH], const char *pszPathName, bool bNoDot = true);static int UpdateTextFile(const char *pszFilePath, const char *pszText);static unsigned int Crc32(const unsigned char *pBuf, int nBufLen, unsigned int uiInitialCrc = 0);static int System(const char *pszCommand, bool bRunInBackgroundProcess = true);static int Fork(char *argv[], int &nPID, bool bRunInBackgroundProcess = true);static int WaitPID(int nPID, bool bRunInBackgroundProcess = true);static int GetPIDByCommand(const char *pszCommand, bool bExactlyMatch = false);private:CHP_Utils();~CHP_Utils();static bool StrMatchedInternal(const char *pszText, char *pszPattern);static bool IsQuanJiao(const char *pszText);static char *StrnCpy(char *pszDst, const char *pszSrc, size_t szLen);static void MakeCrcTable();static char CharToHex(char cValue);static bool IsCommandProcessExist(int nPID, const char *pszCommand);static bool ComposeForkData(char *argv[], char *pData, int &nDataLen);private:
#ifdef _WIN32static HQUERY s_hQueryCPU;static HCOUNTER *s_pCounterCPU[HP_UTILS_MAX_PROCESSOR_COUNT];static HQUERY s_hQueryDownNetwork;static HQUERY s_hQueryUpNetwork;static std::vector<HCOUNTER *> s_vctCounterDownNetwork;static std::vector<HCOUNTER *> s_vctCounterUpNetwork;static HQUERY s_hQueryProcessCPU;static HQUERY s_hQueryProcessMem;static HQUERY s_hQueryProcessVirMem;static HCOUNTER *s_pCounterProcessCPU;static HCOUNTER *s_pCounterProcessMem;static HCOUNTER *s_pCounterProcessVirMem;
#elsestatic float s_pfLastCPUIdle[HP_UTILS_MAX_PROCESSOR_COUNT];static unsigned int s_puiLastCPUTotal[HP_UTILS_MAX_PROCESSOR_COUNT];static unsigned int s_uiLastDownload;static unsigned int s_uiLastUpload;static unsigned int s_uiLastNetworkTick;static float s_fLastTotalTime;static float s_fLastProcessTime;static float s_fCurTotalTime;static float s_fCurProcessTime;static CHP_Mutex m_mutexDir;static HP_SOCKET m_sockBackgroundProcess;static CHP_Mutex m_mutexBackgroundProcess;
#endifstatic bool s_bCrcTableEmpty;static unsigned int s_puiCrcTable[256];
};

        CHP_Utils类提供的公共接口有60个左右,这里就不一一介绍了。有需要的大佬可以关注微信公众号“希望睿智”,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。。

总结

        到这里,本专栏的所有内容就全部结束了。希望本专栏的内容能够帮助到各位大佬,有任何意见和问题,请在评论区反馈。最后,将这首写于2022年3月的拙词《蝶恋花》献给各位大佬。

已是晚春风微冷。片片残花,铺就满地粉。

今朝夏日应欢腾,却把来年春儿等。

  

已是中年近半生。颗颗雄心,化入水中沉。

功名利禄纵可能,最愿返璞又归真。

💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode:两数之和

普通版本&#xff08;暴力枚举&#xff09; 题目链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; //自己写的for循环 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;bool flag …

浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 和上一题的思路一样&#xff0c;每进行一次迭代&#xff0c;来验证当前序列是否和给定的序列相同 代码展示 #include <cstdlib> #include <iostream> #define MAXSIZE 10…

【PHP小课堂】PHP中的网络组件相关函数

PHP中的网络组件相关函数 作为一门以 WEB 开发为主战场的编程语言来说&#xff0c;PHP 即使是在目前这个大环境下&#xff0c;依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件&#xff0c;而且它们都是不需要安装扩展就能够使用的。今天&a…

ubuntu-24.04系统静态Mac和IP配置

操作系统版本&#xff08;桌面版&#xff09;&#xff1a;ubuntu-24.04-desktop-amd64.iso 原因说明&#xff1a;因网络的IP地址和Mac是预分配的&#xff0c;所以ubuntu系统需要修改网卡的mac地址和IP才能访问&#xff0c;网络查了半天资料都没成功&#xff0c;后再界面提示&a…

Linux一键式管理jar程序执行周期【完整脚本复制可用】

最近由于频繁更新程序&#xff0c;项目又没有自动部署架构&#xff0c;单独执行脚本很麻烦。因此整理了一个脚本&#xff0c;一键式执行。 linux脚本执过程&#xff1a; 1.ps -ef|grep xxx.jar 查询.jar的进程&#xff0c; 2.如果有删除kill -9 进程。 3. 进程删除成功后 nohup…

网上书城|基于SprinBoot+vue的网上书城管理系统(源码+数据库+文档)

网上书城管理系统 目录 基于SprinBootvue的网上书城管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

NGINX完全指南_实现高性能负载均衡的进阶实操指南

欢迎阅读 2024 版《NGINX 完全指南》。OReilly 已连续九年出版《NGINX 完全指南》&#xff0c;我们不断进行更新以跟上 NGINX 做出的诸多改进。如今&#xff0c;NGINX 是全球最受欢迎的 Web 服务器。该产品于 2004 年首次发布&#xff0c;并不断发展&#xff0c;以满足现代应用…

【进阶篇】Midjourney如何最大限度精准控图,做到收放自如?

和朋友们一起玩MJ也已经快两个月了&#xff0c;从一开始的惊喜&#xff0c;到现在的平淡&#xff0c;大家都开始思考这个到底我们应该怎么用&#xff1f;而不是仅仅是为了满足自己对MJ本身的好奇心&#xff0c;以及生出一张美图时的那种喜悦感。 目前大家最多的疑问就是&#…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

搜索自动补全-elasticsearch实现

1. elasticsearch准备 1.1 拼音分词器 github地址&#xff1a;https://github.com/infinilabs/analysis-pinyin/releases?page6 必须与elasticsearch的版本相同 第四步&#xff0c;重启es docker restart es1.2 定义索引库 PUT /app_info_article {"settings": …

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的&#xff0c;并如何被填充上GraphicBuffer的&#xff0c;怎么也找不到被填充的GraphicBuffer的来源&#xff0c;最终找到了&#xff0c;它的来源是客户端的…

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

STM32F4_HAL_LWIP_RAM接口UDP实验

目录 RAW 的 UDP 接口简介 RAW 的 UDP 实验 硬件设计 例程功能 软件设计 UDP 配置步骤 软件设计流程图 RAW 的 UDP 接口简介 UDP 协议的 RAW 的 API 功能函数&#xff0c;我们使用这些函数来完成 UDP 的数据发送和接收功能。 (1) udp_new 函数 此函数用来创建一个 UDP …

如何用俄语预定酒店,柯桥外贸俄语培训

-Привет, Алекс! Как твои дела? 你好&#xff0c;阿列克斯&#xff01;你最近好吗&#xff1f; -Отлично! Я скоро уезжаю на 10 дней в Санкт-Петербург, но никак не могу найти там…

如何查询Windows 10电脑的IP地址

如何查询Windows 10电脑的IP地址 引言 在Windows 10操作系统中&#xff0c;查询电脑的IP地址是一项基本而重要的任务&#xff0c;无论是为了配置网络、解决连接问题&#xff0c;还是进行远程访问。 基础知识 IP地址&#xff1a;互联网协议地址&#xff0c;用于标识网络中的…

帆软报表点击表格给数据集传递参数案例

一、效果 有四个模块&#xff0c;分别是采购总金额&#xff0c;采购总数量&#xff0c;采购合同数量&#xff0c;采购合同申请数量通过点击单元格上的月份&#xff0c;展示不同的月份数据&#xff0c;进行单元格和表格之间的联动 二、准备好数据库表和展示数据内容 2.1 建表 …

私人健身与教练预约|基于SprinBoot+vue的私人健身与教练预约管理系统(源码+数据库+文档)

私人健身与教练预约管理系统 目录 基于SprinBootvue的私人健身与教练预约管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能 5.2.2用户功能 5.2.3教练功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算…

CentOS8搭载正反向解析dns服务器

1.介绍&#xff08;是什么&#xff09; DNS&#xff08;Domain Name System&#xff09;&#xff0c;即域名系统&#xff0c;是一个将域名和 IP 地址相互映射的分布式数据库&#xff0c;它可以将用户输入的域名转换成对应的 IP 地址。DNS 由多个服务器组成&#xff0c;分为多个…

Spring AOP魔法揭秘:代理生命周期的深度之旅

1. Spring AOP概述 Spring AOP&#xff08;Aspect-Oriented Programming&#xff09;是Spring框架中一个强大的功能&#xff0c;它允许开发者在不修改业务逻辑代码的情况下&#xff0c;为业务逻辑添加额外的功能&#xff0c;如日志、事务管理、权限验证等。这些额外的功能被称…