编写现代C++代码:GSL 4.0.0 正式可用

编写现代C++代码:GSL 4.0.0 正式可用

作者:BlogUpdater |  时间:2022-02-11 |  浏览:1352 |  评论已关闭 条评论

要搞明白什么是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》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。