九、杂项讨论
条款53:不要轻忽编译器的警告
编译器的作者对一些接下来可能发生的错误的理解一定胜过我们这些普通程序员,如果编译器发出警告,就表明可能存在某种情况会造成一些错误,而这些错误你可能都没想到过。所以我们不要忽略编译器的警告!
class Base
{
public:
virtual void f() const;
};
class Derive
{
public:
virtual void f();
};
这一段编译后,编译器会发出警告:
warning:D::f() hides virtual B::f()
这个警告是告诉你整个B::f()都被遮掩了,而不是说只是B::f()去掉了const。
如果你认为只是遮掩住了const,就大错特错。
作者总结
严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。
不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。
条款54:让自己熟悉包括TR1在内的标准程序库
TR1代表“Technical Report 1”。
在概括TR1之前看一下C++98列入C++标准程序库有哪些主要成分:
- STL。
- Iostream,覆盖用户自定缓冲功能,国际化IO,以及预先定义好的对象cin,cout,cerr和clog。
- 国际化支持,包括多区域能力,比如wchar_t和wstring。
- 数值处理。 包括复数模板(complex)和纯数值数组(valarray)。
- 异常阶层体系。
- C89标准程序库。
下面展示TR1组件实例:
-
智能指针。
-
tr1::function.此物得以表示任何callable entity(可调用物,也就是任何函数或函数对象)。比如我们想注册一个回调函数,该函数接受一个int并且返回一个string,我们可以这么写:
void registerCallback(std::string(int));
使用了tr1::function的话,更富有弹性。**我们接受一个int或者任何一个能够转为int的数值,并返回一个string或者任何能转成string的东西:void registerCallback(std::tr1::functionstd::string(int) func);
-
tr1::bind,这个也很重要,具体另外的博客会谈到。
-
Hash tables.用来实现set,multi_set,map,multi_map.
-
正则表达式。
-
Tuples,即变量组。tr1::tuple可持有任意个数的对象。
-
tr1::array.是个STL化的数组,支持成员函数begin和end的数组,大小固定,并不适用动态内存。
-
tr1::reference_wrapper.
-
随机数生成工具。
-
数学特殊函数。 包括Laguerre多项式,Bessel函数,完全椭圆积分等。
-
C99兼容扩充。
-
Type traits.
-
tr1::result_of,是一个template,用来推导函数调用的返回类型。
作者总结
C++标准程序库的主要机能由STL,iostream,locals组成,并包含C99标准程序库。
TR1添加了智能指针(shared_ptr),一般化函数指针(tr1::function),hash-based容器,正则表达式以及另外10个组件支持。
TR1自身知识一份规范。为获得TR1提供的好处,你需要一份实物,一个好的实物来源是Boost。
条款55:让自己熟悉Boost
为什么要熟悉Boost?
一是因为它和C++标准委员会之间有着很大联系:是由委员会成员创设的。
二是它接纳程序库的过程比较规范:
(1) 先发送邮件投递作品,Boost开发者会评估这个程序库的重要性,并且启动初步审查程序。
(2) 然后开始“讨论,琢磨,再次提交”循环周期。
(3) 最后准备好程序库,正式提交。会有一位复审管理员出面确认你的程序符合Boost的最低要求。比如最少通过两个编译器的,满足可移植性。
(4) 然后你的提交正式进入Boost社群,等待官方复审。期间会有志愿者查看你的程序库的各种素材,并考虑诸如以下问题:
- 这一份设计和实现有多好?
- 这些代码可跨编译器和操作系统吗?
- 这个程序库有可能被它所设定的目标用户————也就是在这个程序库企图解决问题的领域中工作的人们使用吗?
- 文档是否清楚、齐备,而且精准吗?
- 字符串与文本处理。 覆盖具备类型安全等吗。
作者总结
Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。Boost在C++标准化过程中扮演深具影响力的角色。
Boost提供许多TR1组件实现品,以及其他许多程序库。