C++编程规范之14:宁要编译和连接时错误,也不要运行时错误

简介:

摘要:

    能够在编译时做的事情,就不要推迟到运行时;编写代码时,应该在编译期间使用编译器检查不变式,而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下都能够获得更高的可信度。

    在静态检查和动态检查的问题上分为两大阵营,静态检查阵营有:C++、Java,ML,Haskell;动态阵营有:Smalltalk,Ruby,Python和lisp。静态阵营认为采取静态检查可以很容易地省去一大类运行时的错误处理,从而使程序更加牢靠。动态检查阵营认为编译器只能检查出一部分潜在的错误,所以,既然无论如何都要写单元测试,那么根本就无需劳神费心地进行静态检查,这样还能拥有一个宽松的编程环境。

    但是,作为静态检查阵营的C++,提供了强大的静态检查,而对自动运行时检查的支持很少,所以我们应该尽可能使用C++的优势工具,同时对于数据和控制流有关的检查来说,使用运行时检查也是很明智的选择。

在编译和连接时的静态检查有下列好处:

1.      静态检查与数据和控制流无关。

2.      静态表示的模型更加可靠。

3.      静态检查不会带来运行时开销。

    有些情况下,可以使用编译时检查来代替运行时检查。

    1.      编译时布尔条件。如果测试的是编译时布尔条件,比如sizeof(int) > 8,那么可以使用静态断言取代运行时测试。

    2.      编译时多态。定义泛型函数或者类型时,考虑用编译时多态代替运行时多天,前者产生的嗲吗能够更好地进行静态检查。

    3.      枚举。在需要表示符号常量或受限数值时考虑定义enum。

向下强制。如果经常使用dynamic_case执行向下强制,则可能说明基类提供的功能太少了。此时可以考虑重新设计接口,使程序能够用基类表示计算。
相关文章
|
1月前
|
编译器 C++
【C++练级之路】【Lv.11】模板(你真的了解模板特化和分离编译吗?)
【C++练级之路】【Lv.11】模板(你真的了解模板特化和分离编译吗?)
|
1月前
|
安全 程序员 编译器
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
235 1
|
19天前
|
Linux 编译器 C++
Linux centOS 编译C/C++
Linux centOS 编译C/C++
|
1月前
|
存储 算法 测试技术
|
1月前
|
程序员 编译器 C++
|
1月前
|
运维 Serverless Go
Serverless 应用引擎产品使用之在阿里云函数计算中c++模板,将编译好的C++程序放进去部署如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
存储 IDE 编译器
C++从入门到精通:1.3.1了解IDE与C++程序的编写、编译和运行
C++从入门到精通:1.3.1了解IDE与C++程序的编写、编译和运行
|
1月前
|
Ubuntu 编译器 C++
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
【Conan 入门教程 】在Ubuntu上使用Conan编译C++第三方库:一站式解决方案
527 1
|
1月前
|
编译器 C++
如何判断一段程序是由 C 编译程序还是由 C++ 编译程序编译的?
如何判断一段程序是由 C 编译程序还是由 C++ 编译程序编译的?
|
1月前
|
编译器 C语言 C++
c语言中代码运行时发生c++弹窗的解决方法
通过遵循这些步骤,你应该能够解决在C语言代码运行时出现C++弹窗的问题,确保代码在纯C环境中运行。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
23 0