boost:system
- 跨平台、可移植一直是很多C++程序员追求的目标。但由于C++是一种中级语言,很多时候都要和操作系统打交道,因而功能代码常常和平台结合很紧密,难以做到真正的跨平台,再向其他平台移植代码的时候修改操作系统相关的代码通常是必不可少的工作
- boost库提供了数个操作系统相关的库,部分的屏蔽了操作系统的底层细节,能够提高程序的可移植性。比如说
system
库,它封装了操作系统底层的错误代码,为上层提供了一个可移植的统一的处理接口
概述
- C++中处理错误的最佳方式是使用异常,但操作系统和很多底层API不具有这个能力,它们一般使用更通用也更难操作的错误码来表示出错的原因,不同的操作系统的错误码通常是不兼容的,这给跨平台的程序带来了很大的麻烦
- system库使用轻量级的对象封装了操作系统底层的错误码和错误信息,使调用操作系统功能的程序可以很容易的被移植到其他操作系统。它作为基础部件被chrone、filesystem、asio等库使用,并且被接受为C++标准(C++11.19.5)
- system库需要编译才能使用,在jamfile里指定lib的语句是:
lib boost_system
- system库也提供一个特别的宏
BOOST_ERROR_CODE_HEADER_ONLY
,可以把system库完全头文件话,不需要编译或者链接 - system库位于名字空间
boost::system
,需要包含头文件<boost/system/error_code.hpp>
(注意与C++标准名字<system_error>
不同)。即:
#define BOOST_ERROR_CODE_HEADER_ONLY // 无需编译就可以使用system库
#include <boost/system/error_code.hpp>
using namespace boost:system;
错误码
- system库在名字空间
boost::system::errc
下定义了一个很大的枚举类errc_t
,它定义了通用的可移植的错误码,我们应该尽量使用它来标记错误原因:
namespace errc{ //boost::system::errcenum errc_t{ //C++标准定义为enum classsuccess = 0;address_family_not_support;address_in_use;address_not_available;already_connect;...};
};
- system库还在头文件
<boost/system/linux_error.hpp>
和<boost/system/windows_error.hpp>
里分别定义了Linux和windows操作系统的特定的错误值枚举,分别位于名字空间boost::system::linux_error
和boost::system::windows_error
。如果针对这两个操作系统做特定编程,则可以包含这两个头文件
错误类别
system库的核心类是error_category、error_code和error_condition.
error_category
是一个抽象基类,用于标识错误码的类别,它的类摘要如下:
class error_category : public noncopyable{public:virtual ~error_category(){}virtual const char * name() const = 0;virtual std::string message( int ev ) const = 0;virtual error_condition default_error_condition( int ev ) const;virtual bool equivalent( int code, const error_condition & condition ) const;virtual bool equivalent( const error_code & code,int condition ) const;bool operator==(const error_category & rhs) const { return this == &rhs; }bool operator!=(const error_category & rhs) const { return this != &rhs; }bool operator<( const error_category & rhs ) const{return std::less<const error_category*>()( this, &rhs );}};
error_category 的核心函数共有四个
- 成员函数
name()
可以获得类别的名称 message()
可以获得错误码ev对应的描述信息defautl_error_condition()
是一个工程方法,它由错误码ev产生一个error_condition对象equivalent()
用于比较两个错误码是否相等。
error_category 不能直接使用,必须使用继承的方式生成它的子类。system库在匿名名字空间里预定义了两个子类system_error_category
和generic_error_category
,用于表示系统错误和通用可移植错误,可以用位于名字空间boost::system
的自由函数system_category()
和generic_category()
间接访问。
如果我们需要建立一个新的错误类别,则可以从error_category派生一个新类。新类中只有name()和message()是必须实现的,因为他们是纯虚函数,其余的函数可以使用error_category的默认实现。
比如,我们可以定义一个新的错误类别my_category的代码如下:
class my_category : public error_category
{public:virtual const char *name() const { return "myapp_category"; }virtual string message(int ev)const{string msg;switch(ev){case 0:msg = "ok";break;default:msg = "some error";break;}return msg;}
};
错误码
error_code
和error_condition
都用于表示错误码:
- 但error_code更接近操作系统和底层API,而error_condition则更偏重于可移植。
- 两者的声明很类似,但error_code多了一个default_error_condition()方法,可以把error_code转换成error_condition。
error_code的类摘要如下:
class error_code{public:error_code(); error_code(int val, const error_category & cat);void assign(int val, const error_category & cat); //赋值void clear(); //消除错误码int value() const; //获取错误码const error_category& category() const; //获取错误类别error_condition default_error_condition() const; //转换为error_conditionstring message() const; //获取错误描述信息explicit operator bool() const;bool operator==(const error_code& lhs, const error_code& rhs);bool operator!=(const error_code& lhs, const error_code& rhs);bool operator<(const error_code& lhs, const error_code& rhs);
};
error_code和error_condition都可以从一个整数错误值或者errc_t枚举构造,并同时指定所属的错误类别。如果无参构造,那么错误值会是0(无错误)。
error_code对象内部的值可以用value()获得,获得错误描述要使用message(),它将调用error_category的message()返回描述信息。函数category()可以返回错误码所属的类别,因此message()相当于:
ec.category().message(ec.value());
不同的错误类别决定了error_code的含义,相同的代码如果属于不同的类别,那么将具有不同的含义:
my_category my_cat;error_code ec(10, my_cat);cout << ec.value() << ec.message() << endl;ec = error_code(10, system_category());cout << ec.value() << ec.message() << endl;
这段代码的运行结果是:
10 some_error
10 NO child processes
进一步示范这两个错误代码类的用法如下:
cout << system_category().name() << endl; // 输出类别名称error_code ec; // 默认构造一个错误码对象assert(ec.value() == errc::success); // 默认无错误assert(!ec); // 默认无错误,可以bool转换assert(ec.category() == system_category());ec.assign(3L, system_category()); // 错误值为3auto econd = ec.default_error_condition(); // 产生一个可移植的错误码assert(econd == ec); // 比较//也可以直接用system_category产生可移植的错误码assert(econd == system_category().default_error_condition(3L)); cout << ec.message() << endl; // 输出错误描述信息cout << econd.message() << endl;cout << econd.value() << endl; // 输出可移植的错误码
有时候相同的错误码error_code和error_condition可能错误信息并不相同,在编写跨平台的程序时应该尽量使用error_condition,并且使用不依赖于具体错误值的errorc_t枚举
错误异常
system库还提供一个异常类system_error
,它是std::runtime_error
的子类,是对error_code的一个适配,可以把error_code应用到C++的异常处理机制中。
system_error位于名字空间boost::system
,使用时需要另外包含头文件<boost/system/system_error.hpp>
,即:
#include <boost/system/system_error.hpp>
using namespace boost::system
它的类摘要如下:
class system_error : public std::runtime_error
{public:system_error( error_code ec );system_error( error_code ec, const std::string & what_arg );system_error( error_code ec, const char* what_arg );system_error( int ev, const error_category & ecat );system_error( int ev, const error_category & ecat,const std::string & what_arg );system_error( int ev, const error_category & ecat,const char * what_arg );virtual ~system_error() throw() {}const error_code & code() const throw();const char * what() const throw();};
system_error 和标准用法没有太多的差别,构造时需要传入error_code对象,新增的成员函数code()可以返回这个error_code对象的引用。
示例:
try{throw system_error(error_code(5, system_category()));}catch (system_error& e){cout << e.what();}
boost:system相关推荐
- boost:从0到1开发boost(linux、clion)
boost 1.安装包下载 下载地址 选一个就好 并将安装包放到centos的适当目录下 2.设置编译器和所选库 解压 $ tar -xvf boost_1_74_0_b1.tar.bz2 运行解压后 ...
- Boost:在GPU上对整数向量进行排序
Boost:在GPU上对整数向量进行排序 实现功能 C++实现代码 实现功能 Boost的compute模块,在GPU上对整数向量进行排序 C++实现代码 #include <algorithm ...
- Boost:在向量中打印值
Boost:在向量中打印值 实现功能 C++实现代码 实现功能 Boost的compute模块,在向量中打印值 C++实现代码 #include <iostream> #include & ...
- Boost:使用find_if()算法来检测两个向量交叉的点
Boost:使用find_if()算法来检测两个向量交叉的点 实现功能 C++实现代码 实现功能 Boost的compute模块,使用find_if()算法来检测两个向量交叉的点 C++实现代码 #i ...
- Boost:使用mapd_view类将数字数组映射到设备内存
Boost:使用mapd_view类将数字数组映射到设备内存 实现功能 C++实现代码 实现功能 Boost的compute模块,使用mapd_view类将数字数组映射到设备内存 C++实现代码 #i ...
- Boost:实现了k-means聚类算法
Boost:实现了k-means聚类算法 实现功能 C++实现代码 实现功能 Boost的compute模块 ,实现了k-means聚类算法 C++实现代码 #include <opencv2/ ...
- Boost:嵌入PTX汇编指令 直接将其添加到boost.compute函数中
Boost:嵌入PTX汇编指令 直接将其添加到boost.compute函数中 实现功能 C++实现代码 实现功能 Boost的compute模块,嵌入PTX汇编指令 直接将其添加到boost.com ...
- Boost:在GPU上对int的std :: vector进行排序
Boost:在GPU上对int的std :: vector进行排序 实现功能 C++实现代码 实现功能 Boost的compute模块,在GPU上对int的std :: vector进行排序 C++实 ...
- Boost:演示了black-scholes option 定价内核
Boost:演示了black-scholes option 定价内核 实现功能 C++实现代码 实现功能 演示了black-scholes option 定价内核 C++实现代码 #include & ...
最新文章
- FireDac 的数据库批量语句提交(高效)
- 依赖包的添加和自动检测机制
- makefile文件的书写规则(make和makefile)
- a4988 脉宽要求_基于STM32的微型步进电机驱动控制器设计
- JSP中meta http-equiv=pragma content=no-cache属性ttp-equiv功能介绍转载
- 报错日常——Tomcat45秒超时问题
- Linux学习总结(八)-磁盘格式化,挂载,swap扩容
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-2.申请微信支付介绍和不同场景的支付方式...
- 我的世界服务器哪个有自动铺路,超简单命令方块铺路机 我的世界自动铺路机制作教程(附存档)...
- 2018-PAT春季考试小结
- 一位10年 Java 工作经验的架构师聊 Java 和工作经验
- Linux压缩、解压、打包文件 修改文件所属组
- QPython+uiautomator2安卓手机自动化脚本编写
- C语言给小学生出题(随机1~99进行四则运算)
- python基础——matplotlib——scatter和plot方法中的maker参数(点的样式)
- 论不良贷款拨备覆盖率的局限性和建议
- ant design vue 的 description组件中 label 默认样式的更改
- java textpad_TextPad 和JDK使用方法
- 网络安全重要法律解读
- c++数独小游戏3.3