【C++】POCO学习总结(十三):类型和字节序、错误处理和调试、获取系统信息

【C++】郭老二博文之:C++目录

1、类型

POCO为固定大小的整数定义了类型
头文件:#include “Poco/Types.h”

  • Poco::Int8
  • Poco::Int16,
  • Poco::Int32,
  • Poco::Int64
  • Poco::UInt8
  • Poco::UInt16
  • Poco::UInt32
  • Poco::UInt64
  • Poco::IntPtr, Poco::UIntPtr:与指针大小相同的整数(32 or 64 bits)

2、long类型和指针类型

POCO有两个宏来确定long类型和指针类型的大小。
如果指针为64位,则有宏定义:POCO_PTR_IS_64_BIT,否则无
如果long为64位,则有宏定义:POCO_LONG_IS_64_BIT,否则无

3、Poco::ByteOrder 字节序

3.1 本机字节序

POCO使用宏来确定当前主机的字节顺序:

  • POCO_ARCH_LITTLE_ENDIAN:如果本机是小端序
  • POCO_ARCH_BIG_ENDIAN:如果本机是大端序

3.2 字节序转换

类Poco::ByteOrder提供了字节顺序转换的静态方法。
所有功能均可用于:Int16, UInt16, Int32, UInt32, Int64, UInt64

  • IntXX flipBytes(IntXX value):将字节顺序从大端改为小端,反之亦然
  • IntXX toBigEndian(IntXX value):将主机字节序转换为大端
  • IntXX toLittleEndian(IntXX value):将主机字节序转换为小端
  • IntXX fromBigEndian(IntXX value):从大端字节序转换为主机字节序
  • IntXX fromLittleEndian(IntXX value):将小端字节序转换为主机字节序
  • IntXX tonnetwork (IntXX值):将主机字节序转换为网络字节序
  • IntXX fromNetwork(IntXX value):将网络字节顺序转换为主机字节顺序
  • 网络字节顺序为大端

3.3 示例

vi ByteOrderTest.cpp

#include "Poco/ByteOrder.h"
#include <iostream>
using Poco::ByteOrder;
using Poco::UInt16;
int main(int argc, char** argv)
{#ifdef POCO_ARCH_LITTLE_ENDIANstd::cout << "little endian" << std::endl;#elsestd::cout << "big endian" << std::endl;#endifUInt16 port = 80;UInt16 networkPort = ByteOrder::toNetwork(port);return 0;
}

编译:

g++ ByteOrderTest.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

输出:(大部分电脑都是小端)

little endian

4、Poco::Any 任意类型

4.1 说明

Poco::Any的实例可以保存任何内置或用户定义类型的值。
Poco: Any支持值语义。
该值可以通过类型安全的方式提取。
必须知道值的类型才能提取它。
Poco::AnyCast()和Poco::RefAnyCast()函数模板用于提取值。

4.2 示例

vi any.cpp

#include "Poco/Any.h"
#include "Poco/Exception.h"
#include <iostream>using Poco::Any;
using Poco::AnyCast;
using Poco::RefAnyCast;int main(int argc, char** argv)
{Any any(42);int i = AnyCast<int>(any); // okayint& ri = RefAnyCast<int>(any); // okaystd::cout << "i = " << i << "; ri = " << ri << std::endl;try{short s = AnyCast<short>(any); // throws BadCastException}catch (Poco::BadCastException&){std::cout << "BadCastException" << std::endl;}return 0;
}

编译:

g++ any.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

输出:

i = 42; ri = 42
BadCastException

5、Poco::DynamicAny 动态任意类型

5.1 说明

头文件:#include “Poco/DynamicAny.h”
Poco::DynamicAny的实例可以保存动态任意类型的值。
Poco::DynamicAny支持值语义。
该值可以通过类型安全的方式提取。
支持各种类型(标准类型,std::string)的安全隐式和显式转换(检查范围)。

注意事项:(禁止数字值的数据丢失)

  • value < 0永远不会转换为unsigned类型
  • value需要x位,永远不会转换为更小的位范围(例如:value = 2000,需要16位,禁止转换为8位)
  • 允许从int到float再返回的精度损失
  • 允许字符串截断(字符串为单个字符)

5.2 示例

vi dany.cpp

#include "Poco/DynamicAny.h"
#include "Poco/Exception.h"
#include <iostream>
using Poco::DynamicAny;int main(int argc, char** argv)
{DynamicAny any(42);int i = any;std::string s(any.convert<std::string>());std::cout << "i = " << i << "; s = " << s << std::endl;any.convert(s); // or without the need to castconst int& ri(any.extract<int>());short ss = any;std::cout << "ri = " << ri << "; ss = " << ss << std::endl;try{short s = any.extract<short>(); // throws BadCastException}catch (Poco::BadCastException&){std::cout << "BadCastException" << std::endl;}return 0;
}

编译:

g++ dany.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

输出:

i = 42; s = 42
ri = 42; ss = 42
BadCastException

6、异常

6.1 说明

所有POCO异常都是POCO::Exception的子类,Poco::Exception派生自std:: Exception。
头文件:#include “Poco/Exception.h”
比如:

  • Poco::LogicException :逻辑错误
  • Poco::RuntimeException:运行错误
  • Poco::ApplicationException:应用级错误

每个Poco::Exception都有一个name名字、message(描述异常的原因)、可选的嵌套异常

6.2 常用函数

  • const char* name() const :返回异常的名称
  • std::string& message() const:返回构造函数传递的消息文本
  • std::string displayText() const:返回名称和消息文本,以":"分隔
  • const Exception* nested() const:返回一个指向嵌套异常的指针,如果没有则返回0
  • Exception* clone() const:返回异常的精确副本
  • void rethrow() const:重新抛出异常

6.3 自定义异常

POCO_DECLARE_EXCEPTION:声明异常类
POCO_IMPLEMENT_EXCEPTION:实现异常类

// MyException.h
#include “Poco/Exception.h”
POCO_DECLARE_EXCEPTION(MyLib_API, MyException, Poco::Exception)

// MyException.cpp
#include “MyException.h”
POCO_IMPLEMENT_EXCEPTION(MyException, Poco::Exception, “Something really bad happened…”)

7、断言

运行时检查的宏

  • poco_assert(cond):如果cond≠true,抛出AssertionViolationException
  • poco_assert_dbg(cond):类似于poco_assert,但仅在调试版本中使用
  • poco_check_ptr(ptr):如果ptr为空,抛出NullPointerException
  • poco_bugcheck(), poco_bugcheck_msg(string):抛出BugcheckException

8、调试

1)在调试构建中,可以使用宏poco_debugger()和poco_debugger_msg(message)强制设置断点(如果代码在调试器的控制下运行)。
2)poco_assert、poco_check_ptr和poco_bugcheck在调试和发布版本中都是启用的。在调试版本中,如果调试器可用,则在抛出异常之前触发断点。
3)poco_assert_dbg和poco_debugger仅在调试版本中启用。
4)使用bool Debugger::isAvailable()检查是否在调试器下运行。
5)使用void Debugger::enter()强制一个断点。
6)使用void Debugger::message()将消息写入调试器日志或标准输出。

9、编译时获取系统信息

9.1 POCO_OS 平台相关的宏

头文件:Poco/Platform.h
POCO_OS宏可用于确定操作系统。它将有以下值之一:
POCO_OS_AIX
POCO_OS_LINUX
POCO_OS_SOLARIS
POCO_OS_CYGWIN
POCO_OS_MAC_OS_X
POCO_OS_TRU64
POCO_OS_FREE_BSD
POCO_OS_NET_BSD
POCO_OS_VMS
POCO_OS_HPUX
POCO_OS_OPEN_BSD
POCO_OS_VXWORKS
POCO_OS_IRIX
POCO_OS_QNX
POCO_OS_WINDOWS_NT

Windows平台:POCO_OS_FAMILY_WINDOWS
Unix平台:POCO_OS_FAMILY_UNIX

9.2 POCO_ARCH 硬件相关的宏

POCO_ARCH宏可用于确定硬件体系结构。它将有以下值之一:
POCO_ARCH_ALPHA
POCO_ARCH_IA64: Intel 64-bit
POCO_ARCH_AMD64
POCO_ARCH_MIPS
POCO_ARCH_ARM
POCO_ARCH_POWER
POCO_ARCH_HPPA
POCO_ARCH_PPC
POCO_ARCH_IA32 : Intel 32-bit
POCO_ARCH_SPARC

9.3 大小端

POCO_ARCH_LITTLE_ENDIAN:架构是小端序
POCO_ARCH_BIG_ENDIAN:架构是大端序

10、运行时的系统信息

Poco::Environment的静态函数,用于在运行时确定系统和环境信息。
头文件:#include “Poco/Environment.h”

  • std::string get(const Std::string& name):返回环境变量的值,如果变量未定义,抛出Poco::NotFoundException。
  • bool has(const std::string& name):检查是否定义了环境变量。
  • void set(const std::string& name, const std::string& value):设置环境变量的值。
  • std:: string osName ():返回操作系统的名称(uname)。
  • std::string osVersion():返回操作系统的版本(uname -r)。
  • std::string osArchitecture():返回描述硬件架构的字符串(uname -m)。
  • std::string nodeName():返回计算机名(uname -n)。类似Poco::DNS::hostName()
  • std:: string nodeId ():返回在系统上找到的第一个以太网适配器的以太网地址,格式为xx:xx:xx:xx:xx(如果没有以太网适配器,则返回全零)。
#include "Poco/Environment.h"
#include <iostream>
using Poco::Environment;
int main(int argc, char** argv)
{std::cout << "OS Name: " << Environment::osName() << std::endl<< "OS Version: " << Environment::osVersion() << std::endl<< "OS Arch: " << Environment::osArchitecture() << std::endl<< "Node Name: " << Environment::nodeName() << std::endl<< "Node ID: " << Environment::nodeId() << std::endl;if (Environment::has("HOME"))std::cout << "Home: " << Environment::get("HOME") << std::endl;Environment::set("POCO", "foo");return 0;
}

编译:

g++ e.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd

输出:

OS Name: Linux
OS Version: 6.2.0-37-generic
OS Arch: x86_64
Node Name: laoer-VirtualBox
Node ID: 08:00:27:ad:b1:7a
Home: /home/laoer

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

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

相关文章

低多边形植物模型法线贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

【STM32】DMA直接存储器存取

1 DMA简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 可以直接访问STM32的存储器的&#xff0c;包括运行SRAM、程序存储器Flash和寄存器等等 DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节…

单片机——通信协议

一.同步通信和异步通信 &#xff08;1&#xff09;同步通信 通信时序&#xff1a;同步通信是基于时钟信号的通信方式。发送端和接收端需要共享相同的时钟信号&#xff0c;以确定数据传输的时刻。等待&#xff1a;在同步通信中&#xff0c;发送端和接收端必须等待时钟信号的到…

I.MX RT1170双核学习(1):双核通信之MU消息单元详解

在I.MX RT1170中&#xff0c;它有CM7和CM4核&#xff0c;而消息单元(MU)模块使SoC内的两个处理器能够通过MU接口传递消息以进行通信和协调。 文章目录 1 MU特性2 功能描述3 MU通信实例3.1 轮训实现多核通信3.1.1 MU_SetFlags和MU_GetFlags3.1.2 MU_SendMsg和MU_ReceiveMsg3.1.…

路由基本原理

目录 一、路由器概述 二、路由器的工作原理 三、路由表的形成 四、路由配置 1.连接设备 2.进入系统模式 3.进入接口模式 4.配置网络 5.下一跳的设置 6.设置浮动路由 7.设置默认路由 一、路由器概述 路由器&#xff08;Router&#xff09;是一种用于连接不同网络或子…

力扣-383. 赎金信

文章目录 力扣题目代码分析 力扣题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一…

django实现增删改查分页接口

django实现增删改查分页接口(小白必备) 在上篇文章中我使用nodejs实现了增删改查分页接口&#xff0c;这一篇我们则使用django实现。 1.创建一个django项目&#xff0c;命令如下 python manage.py startapp myapp 2.在你自己的myapp文件夹中的models.py中定义你们自己的模型 f…

看图识药,python开发实现基于VisionTransformer的119种中草药图像识别系统

中药药材图像识别相关的实践在前面的系列博文中已经有了相应的实践了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff0c;每篇文章的侧重点不同&#xff1a; 《python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统》 《基于轻量级MnasNet模型开发构建40种常…

元编程(Metaprogramming)

本章将介绍第8️⃣种编程范式---元编程&#xff0c;以及它的优缺点、案例分析和小项目的代码示例。 优点 元编程的优点&#xff1a; 灵活性和可重用性&#xff1a;元编程允许在运行时生成代码&#xff0c;使得程序更加灵活和可重用。可以根据需要动态生成代码片段&#xff0…

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数 一、创建KafkaAdminClient二、获取kafka集群topic元信息三、获取每个topic的名称、分区数、副本数四、生成增加topic副本的json文件五、执行增加topic副本的命令六、确认topic增加副本是否成功一、创建K…

Linux——基本指令(二)

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 紧接上一章&#xff0c;我们在理解接下来的命令之前&#xff0c…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机通过SDK获取相关生产信息的技术背景通过SDK获取相机信息的代码分析获取Baumer工业相机相关信息Baumer工业相机相关参数信息获取的测试 Baume…

【EventBus】EventBus源码浅析

二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射&#xff1a;2. typesBySubscriber 映射&#xff1a;2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…

SpringBoot集成MyBatis-Plus实现分页查询

引入MyBatis-Plus依赖&#xff0c;下面注意指定自己的MyBatis-Plus版本。 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version> </dep…

Axure的使用

1.Axure是什么&#xff1f;&#xff1f;&#xff1f; Axure是一款功能强大的原型设计工具&#xff0c;它可以让用户快速地创建交互式原型&#xff0c;并针对原型进行测试和改进。Axure的主要特点包括可定制的界面元素库、交互动画效果、条件逻辑、团队协作等功能&#xff0c;适…

digit函数

题目描述 在程序中定义一函数 digit(n,k)&#xff0c;它能分离出整数 n 从右边数第 k 个数字。 输入格式 正整数 n 和 k。 输出格式 一个数字。 输入输出样例 输入 #1 31859 3 输出 #1 8 说明/提示 n≤10^9。 k≤10。 因为用整数n来做有点难&#xff0c;所以我用…

day02、数据库系统的结构抽象与演变

数据库系统的结构抽象与演变 1、数据库系统的标准结构1.1 分层抽象1.2 数据视图与模式1. 3 三级模式与两层映像是数据系统的标准结构1.4 逻辑独立性与物理独立性 2 数据模型、数据、模式三者区别3. 文件系统到数据库&#xff08;数据的不可再分特性&#xff0c;我们将他称为第一…

python:五种算法(SSA、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、麻雀搜索算法SSA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

在做题中学习(32):只出现一次的数字 III

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; 根据题目可知&#xff1a;有两个元素只出现一次&#xff0c;其余出现两次。 而在只出现一次的数字 I 里&#xff0c;只有一个元素出现一次&#xff0c;可以用异或的方式直接得到最后的答案&#xff0c;而此…

(C++)长度最小的子数组--滑动窗口

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…