C++编程规范之14:宁要编译和连接时错误,也不要运行时错误
2013-12-09 21:19
225 查看
摘要:
能够在编译时做的事情,就不要推迟到运行时;编写代码时,应该在编译期间使用编译器检查不变式,而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下都能够获得更高的可信度。
在静态检查和动态检查的问题上分为两大阵营,静态检查阵营有:C++、Java,ML,Haskell;动态阵营有:Smalltalk,Ruby,Python和lisp。静态阵营认为采取静态检查可以很容易地省去一大类运行时的错误处理,从而使程序更加牢靠。动态检查阵营认为编译器只能检查出一部分潜在的错误,所以,既然无论如何都要写单元测试,那么根本就无需劳神费心地进行静态检查,这样还能拥有一个宽松的编程环境。
但是,作为静态检查阵营的C++,提供了强大的静态检查,而对自动运行时检查的支持很少,所以我们应该尽可能使用C++的优势工具,同时对于数据和控制流有关的检查来说,使用运行时检查也是很明智的选择。
在编译和连接时的静态检查有下列好处:
1. 静态检查与数据和控制流无关。
2. 静态表示的模型更加可靠。
3. 静态检查不会带来运行时开销。
有些情况下,可以使用编译时检查来代替运行时检查。
1. 编译时布尔条件。如果测试的是编译时布尔条件,比如sizeof(int) > 8,那么可以使用静态断言取代运行时测试。
2. 编译时多态。定义泛型函数或者类型时,考虑用编译时多态代替运行时多天,前者产生的嗲吗能够更好地进行静态检查。
3. 枚举。在需要表示符号常量或受限数值时考虑定义enum。
向下强制。如果经常使用dynamic_case执行向下强制,则可能说明基类提供的功能太少了。此时可以考虑重新设计接口,使程序能够用基类表示计算。
能够在编译时做的事情,就不要推迟到运行时;编写代码时,应该在编译期间使用编译器检查不变式,而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下都能够获得更高的可信度。
在静态检查和动态检查的问题上分为两大阵营,静态检查阵营有:C++、Java,ML,Haskell;动态阵营有:Smalltalk,Ruby,Python和lisp。静态阵营认为采取静态检查可以很容易地省去一大类运行时的错误处理,从而使程序更加牢靠。动态检查阵营认为编译器只能检查出一部分潜在的错误,所以,既然无论如何都要写单元测试,那么根本就无需劳神费心地进行静态检查,这样还能拥有一个宽松的编程环境。
但是,作为静态检查阵营的C++,提供了强大的静态检查,而对自动运行时检查的支持很少,所以我们应该尽可能使用C++的优势工具,同时对于数据和控制流有关的检查来说,使用运行时检查也是很明智的选择。
在编译和连接时的静态检查有下列好处:
1. 静态检查与数据和控制流无关。
2. 静态表示的模型更加可靠。
3. 静态检查不会带来运行时开销。
有些情况下,可以使用编译时检查来代替运行时检查。
1. 编译时布尔条件。如果测试的是编译时布尔条件,比如sizeof(int) > 8,那么可以使用静态断言取代运行时测试。
2. 编译时多态。定义泛型函数或者类型时,考虑用编译时多态代替运行时多天,前者产生的嗲吗能够更好地进行静态检查。
3. 枚举。在需要表示符号常量或受限数值时考虑定义enum。
向下强制。如果经常使用dynamic_case执行向下强制,则可能说明基类提供的功能太少了。此时可以考虑重新设计接口,使程序能够用基类表示计算。
相关文章推荐
- C++编译错误,连接错误,运行错误
- ADO连接数据库,编译到客户机运行时出现CreateInstance报错0x80004002、CreateParameter报0xC0000005错误的解决方法。
- Python程序编译运行出现错误:IndentationError: unindent does not match any outer indentation level
- 预处理、编译、连接、运行
- C# asp.net常见编译|运行错误
- qt连接数据库出现好多编译错误
- 运行时错误检查(/RTC)编译选项及实现原理
- 通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败。错误:“驱动程序收到意外的登录前响应。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受
- 编译错误和运行错误
- 程序运行过程中的编译与连接阶段
- atof函数在不包含头文件stdlib.h的情况下也能编译运行,但是转换结果是错误的,为什么
- vc++ 使用64位平台编译,运行程序出现0xc000007b错误的解决方案
- 【转载】linux里命令pkg-config工具的使用(编译和连接, 运行时)
- Android 关于图片文件夹后缀错误,使应用在源码下编译通过却无法运行的错误
- 28335编译通过,连接出现如下错误的原因
- 在运行rcnn中,调用caffe编译好的matlab接口时,遇到 libmkl_rt.so和libcudart.so.5.5错误
- LodaRunner 脚本运行时连接错误解决办法(Error -27098)
- iis运行一段时间后 基础连接已经关闭: 接收时发生错误
- Delphi 2007 每次编译运行后出现错误: Assertion failure
- VS* 之VC 常见编译运行错误 积累