最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Boost System超詳細(xì)講解

 更新時間:2022年11月25日 09:19:29   作者:無水先生  
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱

一、說明

以下庫支持錯誤處理。

  • Boost.System 提供類來描述和識別錯誤。自 C++11 以來,這些類已成為標(biāo)準(zhǔn)庫的一部分。
  • Boost.Exception 使得在拋出異常后附加數(shù)據(jù)成為可能。

二、關(guān)于 Boost.System庫

Boost.System

Boost.System 是一個庫,本質(zhì)上定義了四個類來識別錯誤。所有四個類都已添加到 C++11 的標(biāo)準(zhǔn)庫中。如果您的開發(fā)環(huán)境支持 C++11,則無需使用 Boost.System。然而,由于許多 Boost 庫使用 Boost.System,您可能會通過其他庫遇到 Boost.System。

boost::system::error_code 是 Boost.System 中最基本的類;它表示特定于操作系統(tǒng)的錯誤。因為操作系統(tǒng)通常會枚舉錯誤,所以 boost::system::error_code 將錯誤代碼保存在一個 int 類型的變量中。示例 55.1 說明了如何使用此類。

示例 55.1。使用 boost::system::error_code

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  std::cout << ec.value() << '\n';
}

Example55.1

示例 55.1 定義了用于返回錯誤的函數(shù) fail()。為了讓調(diào)用者檢測 fail() 是否失敗,boost::system::error_code 類型的對象通過引用傳遞。 Boost 庫提供的許??多函數(shù)都像這樣使用 boost::system::error_code。例如,Boost.Asio 提供函數(shù) boost::asio::ip::host_name(),您可以將類型為 boost::system::error_code 的對象傳遞給該函數(shù)。

Boost.System 在命名空間 boost::system::errc 中定義了許多錯誤代碼。示例 55.1 將錯誤代碼 boost::system::errc::not_supported 分配給 ec。因為 boost::system::errc::not_supported 是一個數(shù)字,而 ec 是 boost::system::error_code 類型的對象,所以函數(shù) boost::system::errc::make_error_code() 被調(diào)用。此函數(shù)使用相應(yīng)的錯誤代碼創(chuàng)建一個類型為 boost::system::error_code 的對象。

在 main() 中,value() 在 ec 上被調(diào)用。此成員函數(shù)返回存儲在對象中的錯誤代碼。

默認(rèn)情況下,0 表示沒有錯誤。每隔一個數(shù)字表示一個錯誤。錯誤代碼值取決于操作系統(tǒng)。有關(guān)錯誤代碼的說明,請參閱操作系統(tǒng)的文檔。

除了 value() 之外,boost::system::error_code 還提供了成員函數(shù) category(),它返回一個 boost::system::error_category 類型的對象。

錯誤代碼只是數(shù)值。雖然 Microsoft 等操作系統(tǒng)制造商能夠保證系統(tǒng)錯誤代碼的唯一性,但應(yīng)用程序開發(fā)人員幾乎不可能在所有現(xiàn)有應(yīng)用程序中保持錯誤代碼的唯一性。這將需要一個中央數(shù)據(jù)庫,其中包含來自世界各地所有軟件開發(fā)人員的錯誤代碼,以避免為不同的錯誤重復(fù)使用相同的代碼。因為這是不切實際的,所以存在錯誤類別。

boost::system::error_code 類型的錯誤代碼屬于可以使用成員函數(shù) category() 檢索的類別。使用 boost::system::errc::make_error_code() 創(chuàng)建的錯誤自動屬于通用類別。如果錯誤未明確分配給另一個類別,則這是錯誤所屬的類別。

示例 55.2。使用 boost::system::error_category

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  std::cout << ec.value() << '\n';
  std::cout << ec.category().name() << '\n';
}

如示例 55.2 所示,category() 返回錯誤的類別。這是一個類型為 boost::system::error_category 的對象。只有幾個成員函數(shù)。例如,name() 檢索類別的名稱。示例 55.2 將泛型寫入標(biāo)準(zhǔn)輸出。

您還可以使用獨立函數(shù) boost::system::generic_category() 來訪問通用類別。

Boost.System 提供了第二類。如果您調(diào)用獨立函數(shù) boost::system::system_category(),您將獲得對系統(tǒng)類別的引用。如果您將類別的名稱寫入標(biāo)準(zhǔn)輸出,則會顯示系統(tǒng)。

錯誤由錯誤代碼和錯誤類別唯一標(biāo)識。因為錯誤代碼只需要在一個類別中是唯一的,所以只要您想要定義特定于您的程序的錯誤代碼,就應(yīng)該創(chuàng)建一個新類別。這使得使用不干擾其他開發(fā)人員的錯誤代碼的錯誤代碼成為可能。

示例 55.3。創(chuàng)建錯誤類別

#include <boost/system/error_code.hpp>
#include <string>
#include <iostream>
class application_category :
  public boost::system::error_category
{
public:
  const char *name() const noexcept { return "my app"; }
  std::string message(int ev) const { return "error message"; }
};
application_category cat;
int main()
{
  boost::system::error_code ec{129, cat};
  std::cout << ec.value() << '\n';
  std::cout << ec.category().name() << '\n';
}

通過創(chuàng)建從 boost::system::error_category 派生的類來定義新的錯誤類別。這需要您定義各種成員函數(shù)。至少必須提供成員函數(shù) name() 和 message(),因為它們在 boost::system::error_category 中被定義為純虛擬成員函數(shù)。對于其他成員函數(shù),如果需要,可以覆蓋默認(rèn)行為。

name() 返回錯誤類別的名稱,而 message() 用于檢索特定錯誤代碼的錯誤描述。與示例 55.3 不同,通常評估參數(shù) ev 以返回基于錯誤代碼的描述。

新創(chuàng)建的錯誤類別類型的對象可用于初始化錯誤代碼。示例 55.3 使用新類別 application_category 定義錯誤代碼 ec。因此,錯誤代碼 129 不再是一般錯誤;相反,它的含義由新錯誤類別的開發(fā)人員定義。

注意

要使用 Visual C++ 2013 編譯示例 55.3,請刪除關(guān)鍵字 noexcept。此版本的 Microsoft 編譯器不支持 noexcept。

boost::system::error_code 提供了一個名為 default_error_condition() 的成員函數(shù),它返回一個類型為 boost::system::error_condition 的對象。 boost::system::error_condition 的接口幾乎與 boost::system::error_code 的接口相同。唯一的區(qū)別是成員函數(shù) default_error_condition(),它僅由 boost::system::error_code 提供。

示例 55.4。使用 boost::system::error_condition

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  boost::system::error_condition ecnd = ec.default_error_condition();
  std::cout << ecnd.value() << '\n';
  std::cout << ecnd.category().name() << '\n';
}

boost::system::error_condition 就像 boost::system::error_code 一樣使用。這就是為什么可以為類型為 boost::system::error_condition 的對象調(diào)用成員函數(shù) value() 和 category() 的原因,如示例 55.4 所示。

類 boost::system::error_code 用于與平臺相關(guān)的錯誤代碼,而 boost::system::error_condition 用于訪問與平臺無關(guān)的錯誤代碼。成員函數(shù) default_error_condition() 將依賴于平臺的錯誤代碼轉(zhuǎn)換為類型為 boost::system::error_condition 的平臺無關(guān)錯誤代碼。

您可以使用 boost::system::error_condition 來識別與平臺無關(guān)的錯誤。例如,此類錯誤可能是對不存在文件的訪問失敗。雖然操作系統(tǒng)可能提供不同的接口來訪問文件并可能返回不同的錯誤代碼,但嘗試訪問不存在的文件在所有操作系統(tǒng)上都是錯誤的。從操作系統(tǒng)特定接口返回的錯誤代碼存儲在 boost::system::error_code 中。描述訪問不存在文件失敗的錯誤代碼存儲在 boost::system::error_condition 中。

Boost.System 提供的最后一個類是 boost::system::system_error,它派生自 std::runtime_error。它可用于在異常中傳輸類型為 boost::system::error_code 的錯誤代碼。

示例 55.5。使用 boost::system::system_error

#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
#include <iostream>
using namespace boost::system;
void fail()
{
  throw system_error{errc::make_error_code(errc::not_supported)};
}
int main()
{
  try
  {
    fail();
  }
  catch (system_error &e)
  {
    error_code ec = e.code();
    std::cerr << ec.value() << '\n';
    std::cerr << ec.category().name() << '\n';
  }
}

在示例 55.5 中,獨立函數(shù) fail() 已更改為在出現(xiàn)錯誤時拋出類型為 boost::system::system_error 的異常。此異??梢詡鬏旑愋蜑?boost::system::error_code 的錯誤代碼。異常在 main() 中捕獲,它將錯誤代碼和錯誤類別寫入標(biāo)準(zhǔn)錯誤。函數(shù) boost::asio::ip::host_name() 的第二個變體就像這樣工作。

到此這篇關(guān)于C++ Boost System超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost System內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)

    Ubuntu系統(tǒng)下如何在VScode配置OpenCV(C++)環(huán)境(.json文件)

    這篇文章主要介紹了如何在VSCode中配置和運行C++程序,包括創(chuàng)建test.cpp文件、配置launch.json、tasks.json和c_cpp_properties.json文件,以及重啟VSCode以解決可能的報錯問題,需要的朋友可以參考下
    2025-02-02
  • Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    用于數(shù)據(jù)傳輸?shù)牡蛯泳W(wǎng)絡(luò)協(xié)議,多個物聯(lián)網(wǎng)協(xié)議都是基于TCP協(xié)議的,這篇文章為大家介紹了Qt?TCP網(wǎng)絡(luò)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ struct 初始化與賦值的實現(xiàn)

    C++ struct 初始化與賦值的實現(xiàn)

    在C++中初始化和賦值語句是兩種不同的語法結(jié)構(gòu),本文主要介紹了C++ struct 初始化與賦值的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • C語言中如何通過指針參數(shù)返回值

    C語言中如何通過指針參數(shù)返回值

    這篇文章主要介紹了C語言中如何通過指針參數(shù)返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • c語言重要的字符串與內(nèi)存函數(shù)

    c語言重要的字符串與內(nèi)存函數(shù)

    這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用和注意事項,并且為了幫助讀者理解和使用,也都模擬實現(xiàn)了他們的代碼,需要的朋友可以參考一下
    2021-09-09
  • C++深入講解引用的特點及與指針的區(qū)別

    C++深入講解引用的特點及與指針的區(qū)別

    引用是C++一個很重要的特性,顧名思義是某一個變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r,這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點,需要的朋友可以參考下
    2022-05-05
  • C++?OpenCV實現(xiàn)之實現(xiàn)紅綠燈識別

    C++?OpenCV實現(xiàn)之實現(xiàn)紅綠燈識別

    本文以實現(xiàn)行車過程當(dāng)中的紅綠燈識別為目標(biāo),核心的內(nèi)容包括:OpenCV輪廓識別原理以及OpenCV紅綠燈識別的實現(xiàn)具體步驟,感興趣的可以了解一下
    2022-08-08
  • 淺談C++11的std::mem_fn源碼解析

    淺談C++11的std::mem_fn源碼解析

    本文是基于gcc-4.9.0的源代碼進(jìn)行分析,std::mem_fn是C++11才加入標(biāo)準(zhǔn)的,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 一起來學(xué)習(xí)C++的函數(shù)指針和函數(shù)對象

    一起來學(xué)習(xí)C++的函數(shù)指針和函數(shù)對象

    這篇文章主要為大家詳細(xì)介紹了C++函數(shù)指針和函數(shù)對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)二叉樹之堆的實現(xiàn)和堆排序詳解

    C語言數(shù)據(jù)結(jié)構(gòu)二叉樹之堆的實現(xiàn)和堆排序詳解

    堆是計算機科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。本文將詳細(xì)介紹堆的實現(xiàn)和堆排序,需要的可以參考一下
    2022-04-04

最新評論

深泽县| 武鸣县| 抚宁县| 台安县| 沁源县| 阿克陶县| 太仆寺旗| 皋兰县| 裕民县| 永吉县| 横峰县| 资阳市| 巴南区| 大余县| 耿马| 阿鲁科尔沁旗| 新田县| 麻江县| 巴里| 沈阳市| 岢岚县| 南开区| 永修县| 平塘县| 米脂县| 八宿县| 余姚市| 常州市| 绵竹市| 西乌珠穆沁旗| 芮城县| 乐至县| 金昌市| 黔西县| 正定县| 湘西| 阜新| 辛集市| 黄梅县| 屏南县| 房山区|