文章目录
九、杂项讨论
条款53:不要轻忽编译器警告
一旦从某个特定编译器的警告信息中获取经验,将学会了解不同的信息意味什么,那往往和它们“看起来”的意义十分不同。对警告信息深刻理解后,就可以选择忽略某些警告信息。
警告与编译器相依,不同编译器有不同警告标准。草率编程指望编译器为你指出错误,不可取。
注意:严肃对待编译器发出的警告信息。努力在编译器的最高警告级别下争取“无任何警告”的荣誉。不要过度依赖编译器的报警能力,因为不同的编译器对待事物的态度并不相同。一旦移植到另一个编译器上,原本依赖的警告信息有可能消失。
条款54:让自己熟悉包括TR1在内的标准程序库
TR1代表“Technical Report 1”,表示了新版C++的来临,称为Standard C++ 1.1。
C++98的标准程序库主要成分:
- STL
- iostream
- 国际化支持,包括多区域(multiple active local)能力。像wchar_t和wstring等类型对促进Unicode有所帮助。
- 数值处理,包括复数模板(complex)和纯数值数组(valarray)。
- 异常阶层体系(exception hierarchy),包括base class exception和derived class logic_error和runtime_error,以及更深继承的各个class。
- C89标准库
TR1有14个组件(std::tr1::…):
- 智能指针
- tr1::function,此物得以表示任何callable entity(可调用物,也就是任何函数或函数对象),只要其签名符合目标。
- tr1::bind,它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事,而又更多。
- 互不干涉的一组
- Hash table,用来实现set、multiset和multi-map。
- 正则表达式
- Tuple(变量组),标准程序库中的pair template的新一代制品。
- tr1::array,本质上是个“STL化”数组,即一个支持成员函数如begin和end的数组。
- tr1::mem_fn,这是个语句构造上与成员函数指针一致的东西。
- tr1::reference_wrapper,一个“让references的行为更像对象”的设施。
- 随机数生成工具
- 数学特殊函数
- C99兼容扩展
- template编程技术构成:
- Type traits,一组traits class(详见条款47),用以提供类型的编译期信息。
- tr1::result_of,这是个 template,用来推导函数调用的返回类型。
TR1的实现:
其本身只是一个文档,但是14个组件中的10个都以Boost为基础实现,其余4个没有(hash table有很多免费或商业源代码)。如果作为权宜之计你想使用Boost中类似TR1的库,你可以像下面这样使用:
namespace std{
namespace tr1 = ::boost;
}
如果编译器提供了tr1实现,删除上面的namespace别名就行。
条款55:让自己熟悉Boost
Boost是社群,也是网站。在C++标准化过程中极具影响力。
Boost内含十个程序库,且不断被加入,偶尔有机能被新的库替代。
Boost个程序库大小及作用范围有很大变化。
Boost程序库对付的主题非常繁多,区分数十个类目,包括:
- 字符串与文本处理,覆盖具备类型安全的printf-like格式化动作,正则表达式和解析。
- 容器,覆盖“接口与STL相似且大小固定”的数组,大小可变的bitsets以及多维数组。
- 函数对象和高级编程,覆盖若干用来作为TR1机能基础的程序库。其中一个程序库是Lambda,它使得可以轻松地创建函数对象。
- 泛型编程(Generic programming),覆盖一大组traits class,详见条款47。
- 模板元编程(Template metaprogramming,TMP,详见 条款48),覆盖一个针对编译期assertion而写的程序库,以及Boost MPL程序库。
- 正确性测试(Correctness and testing),覆盖用来将隐式模板接口(implicit template interfaces,详见条款41)形式化的程序库,以及针对“测试优先”编程形态而设计的措施。
- 数据结构
- 语言间支持
- 内存,覆盖Pool程序库,用来做出高效率而区块带下固定的分配器(详见条款50),以及多变化的智能指针(详见条款13),包括TR1智能指针。
- 杂项,包括CRC检验、日期和时间处理、文件系统上来回移动。
详细见网站。