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

简介:

摘要:

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

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

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

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

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

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

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

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

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

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

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

向下强制。如果经常使用dynamic_case执行向下强制,则可能说明基类提供的功能太少了。此时可以考虑重新设计接口,使程序能够用基类表示计算。
相关文章
|
10月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
250 0
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
800 14
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
为什么C/C++编译腰要先完成汇编
|
11月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
306 0
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
1131 56
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
753 22
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
247 0
Linux c/c++之多文档编译
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
485 12