大家過年好!
要搞明白什麼是GSL,需要先清楚,什麼是C++ Core Guidelines。
C++ Core Guidelines是一份簡單的文檔,裡面描述了一組旨在編寫現代C++代碼的指導原則。這項工程由C++的原作者Bjarne Stroustrup發起并主導,主要聚焦在一些C++工程中出現的各種頂層設計問題,例如,接口設計,資源管理,記憶體管理和并發等。這些頂層設計會影響應用程式架構和庫的設計。遵循這套指導原則,可以實作代碼的靜态類型安全(statically type-safe),規避潛在的資源洩漏問題,以及發現更多的代碼邏輯錯誤,同時擁有更快的運作速度。
而GSL(Guidelines Support Library)是由微軟開發的,C++ Core Guidelines指導原則的一個實作代碼庫,庫中包含了C++ Core Guidelines裡所建議的各種函數,類型等。整個代碼庫以各種頭檔案來實作,使用此代碼庫,需要使用支援C++ 14的編譯器。
好了,正文開始
GSL的4.0.0版本已經正式可用,這次的版本包含了所有的安全編碼規則,另外,我們還添加了一些額外的優化。
有哪些變化?
> 廢棄gsl::string_span
> 移除<gsl/multi_span>
> 頭檔案删除了 gsl_ 字首
> 對not_null進行了修改
> gsl::span和std::span現已使用gsl::at的正确特化版本
> zstring系列不再要求使用空的尖括号,例如我們可以使用void foo(zstring str)來代替:void foo(zstring<> str)
> gsl::narrowing_error新增一個函數what(),用以顯示錯誤的詳細資訊
> finally和final_action現在被标記為[[nodiscard]]
> GSL将可以在禁用異常的環境中工作,但有一些警告
> 通過添加 GSL_NO_IOSTREAMS 标志,GSL将在不支援iostream的環境中工作
> 更新了編譯器支援
> CMake和建構優化
廢棄gsl::string_span
最新版的CppCoreGuidelines中删除了string_span。建議改用std::string_view,std::span或gsl::span。為了更緊密地使GSL與CppCoreGuidelines保持一緻,我們棄用了string_span和zstring_span的實作,包括 basic_string_span、basic_zstring_span和所有相關類型。 目前,我們将繼續保留 <gsl/string_span>頭檔案,但不會積極處理或維護它。可以在 README.md 中找到所有支援和不支援的類型/功能的清單。
移除<gsl/multi_span>
multi_span、strided_span和<gsl/multi_span>中的所有其他内容在一年前的GSL 3.0.0中已被棄用,現在是從庫中删除它們及其相關測試的時候了。
頭檔案删除了gsl_字首
以前在其名稱中包含gsl_字首的所有标頭都已删除此字首。 例如,<gsl/gsl_algorithm>現在是<gsl/algorithm>。 gsl_字首檔案仍然存在并傳遞給更新的檔案,但将在未來的版本中删除。
對not_null進行了修改
為了更緊密地使GSL與CppCoreGuidelines保持一緻,gsl::not_null現在隻接受與 nullptr相當的類型。 以前,它隻接受可從nullptr配置設定的類型,但這比CppCoreGuidelines的意圖更嚴格。
函數make_not_null和make_strict_not_null以及not_null比較運算符現在都是 noexcept。
gsl::span和std::span現已使用gsl::at的正确特化版本
gsl::span和std::span現在有自己獨立的gsl::at特化,以確定兩個版本的span之間的行為一緻。 導入 <gsl/span> 時會引入兩個重載版本。 std::span 重載可以與 <gsl/util> 分開包含。
GSL将可以在禁用異常的環境中工作,但有一些警告
gsl::narrow是庫中唯一可能引發異常的部分,并且已移至其自己的頭檔案 <gsl/narrow> 中。 僅當啟用異常時,此頭檔案才包含在 <gsl/gsl> 中。 這允許在環境中工作的庫使用者無一例外地使用庫的所有其他元件。
注意:gsl::narrow_cast 仍然在 <gsl/util> 中,因為它不會抛出異常。
更新了編譯器支援
支援的編譯器/工具集清單已更新為更新版本,如下圖所示:

CMake和建構優化
> GSL安裝邏輯現在由CMake選項GSL_INSTALL所保護
> 修複了GSL庫在32位主機上建構然後在64位機器上使用的問題
> 如果定義了CMAKE_CXX_STANDARD,建構将使用它
> 清理英特爾編譯器的GSL SUPPRESS警告
> 修複了沒有std::span的C++20編譯器的建構失敗
> 清理了一些靜态分析警告
> CMake緩存變量VS_ADD_NATIVE_VISUALIZERS已重命名為 GSL_VS_ADD_NATIVE_VISUALIZERS
總結
Bjarne Stroustrup創造了屠龍寶刀C++,但我等小朋友容易誤用傷人,又貼心地創造了瑞士軍刀C++ Core Guidelines。
最後
Microsoft Visual C++團隊的部落格是我非常喜歡的部落格之一,裡面有很多關于Visual C++的知識和最新開發進展。大浪淘沙,如果你對Visual C++這門古老的技術還是那麼感興趣,則可以經常去他們那(或者我這)逛逛。
本文來自:《GSL 4.0.0 is Available Now》