新玩意儿更新:C++编码规则及最佳实践

新玩意儿更新:C++编码规则及最佳实践

作者:HQ |  时间:2019-08-24 |  浏览:165 |  评论已关闭 条评论

朋友,你是否也和我一样:咋样都行,就是无法容忍构建结束时出现的编译警告。
对于稍微有点完美主义的我来说,我希望能尽自己最大的能力,消除一切的编译警告。但有时候,我也会感到沮丧:有些警告是无法清除的,至少在目前的开发环境里是没有这种可能性的。

此话怎讲?

比如,我曾经碰到一个关于menifest的格式兼容性报警,要解决此问题,需要升级我电脑里的某一个DLL,但是这个升级需要联系Microsoft售后支持组,进行付费升级才能完成。我当时的决定是:抱歉,打扰了。
所以,这个警告,一直到现在,都留在了我的工程里,就像金碧辉煌的墙壁上的一颗苍蝇。So be it.

再比如,有些大型工程里,会引入许多第三方社区的开源代码库。这些代码库,基本上都是面向Linux/GCC平台编写的,社区老哥们可不会照顾身为Windows平台的开发者的你。当移植这些代码到Windows平台时,不可避免的你会收到MSVC的一些抱怨。当然,你可以对这些海量晦涩的代码进行小修小改,但是我可不准备这么做:可不想惹得自己一身泥呐。

早在VS2017那会,VS开发团队就释出了一个名为C++ Core Guidelines Checker的大杀器,此工具随着VS2017默认安装,这东西一直演化到了如今的VS2019。

首先说说这里所谓的C++ Core Guidelines,我就先叫它们C++核心编码规则吧。这些都是C++的专家,甚至是C++设计者(那个可爱的大胡子(Bjarne,我没有任何恶意啊))关于C++编码的规则集合和最佳实践。幸运的是,VS支持其中的一些规则,并通过C++ Core Guidelines Checker这个工具整合至Visual Studio中。

Bjarne和其他C++大神最初创建了这些规则,目的是为了引导C++开发者编写更加有效,安全的代码(很贴心有么有)。这些规则主要关注C++的静态类型安全和资源安全(你是否想到了内存泄露这些个玩意?)。如果善用这些规则,我们将可以消除代码中那些容易犯错(但是看起来还十分正确)的地方,再不济,它们也可以帮我们减少这些错误。规则还提出了有助于我们改善代码复杂度和性能的一些宝贵的建议。

注意:这些规则由Standard C++ Foundation维护,大家可以去Github围观吃瓜。

下面是稍显晦涩的部分,朋友们,该系好安全带了。

最新版本VS2019 16.3 Preview 2中,开发团队新增了三条新的规则到C++ Core Guidelines Checker中,另外,有一些位于warnings.h中的警告被重命名,或者干脆地,移除了。

下面是关于这次更新的汇总

新的规则集
在这次发布中,Enum Rules被添加进来。这个规格集可以用来检测一些关于Enum使用过程中的一些常见错误。

新规则
Const规则
C26914 – USE_CONSTEXPR_RATHER_THAN_CONST
相比之前的C26498(USE_CONSTEXPR_FOR_FUNCTIONCALL)规则来说,C26914来的更为激进。C26498检查所有传入到函数中的const变量,而C26914将会在编译期对所有const变量进行检查,如果它们的值可以编译期确定,就直接进行优化。注意,这个规则在默认情况下不会被包含在Microsoft Native Recommended Rules中,如果希望使用它,需要在C++ Core Check Const Rules中手动添加。

Enum规则
C26812 – USE_ENUM_CLASS_INSTEAD_OF_ENUM
C26812这个规则建议我们声明所有的枚举为一个”枚举类”。这个规则可以有效的防止将枚举轻易的转换为整型,这可以避免一些出人意料的错误。

Type规则
C26478 – NO_MOVE_OP_ON_CONST
C26478用来防止不必要的调用”std::move”。具体来说,就是可以借助这条规则来控制对常量的”std::move”调用。当我们对一个常量进行”std::move”调用时,这个move操作实际上是进行拷贝操作,而不是将对象的所有权进行转移,而这个行为可能不是开发者所想要的。所以,也就有了这个规则。

Warnings.h的变化
> C26477规则USE_NULLPTR被重命名为:USE_NULLPTR_NOT_CONSTANT
> 规则分类CPPCORECHECK_EXPERIMENTAL_WARNINGS被移除。这个警告中包含的C26800(USE_OF_A_MOVED_FROM_OBJECT)被添加到CPPCORECHECK_LIFETIME_WARNINGS规则中。
> 警告C26810(COROUTINES_USE_AFTER_FREE_CAPTURE)和C26811(COROUTINES_USE_AFTER_FREE_PARAM)从规则分类CPPCORECHECK_CONCURRENCY_WARNINGS中移除,并添加到CPPCORECHECK_LIFETIME_WARNINGS中。

总结
我一直觉得,一个人面对编译警告的态度,在某种程度上来说,可以反映他/她对生活的态度,它可能是在表明:你是否对某些事物,倾尽了全力。
那首歌怎么唱来着:不将就。

标签:

评论已关闭。