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

本文主要是介绍【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

这篇关于【C++】POCO学习总结(十三):类型和字节序、错误处理和调试、获取系统信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/487935

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备