条款53:不要轻忽编译器的警告
请记住:
- 严肃对待编译器发出的警告信息。努力在你的编译器的最高警告级别下争取“无任何警告”的荣誉。
- 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。
条款54:让自己熟悉包括TR1在内的标准程序库
C++98列入的C++标准程序库有哪些主要成分:
- STL,覆盖容器(containers如vector,string,map)、迭代器(iterators)、算法(algorithms如find,sort,transform)、函数对象(function objects 如less,greater)、各种容器适配器(container adapters如stack,priority_queue)和函数对象适配器(function object adapters如 mem_fun,not1)。
- Iostreams,覆盖用户自定缓冲功能、国际化I/O,以及预先定义好的对象cin,cout,cerr和clog。
- 国际化支持,包括多区域(multiple active locales)能力。像wchar_t(通常是16bits/char)和wstring(由wchar_ts组成的strings)等类型都对促进Unicode有所帮助。
- 数值处理,包括复数模板(complex)和纯数值数组(valarray)。
- 异常阶层体系(exception hierarchy),包括base class exception及其derived classes logic_error和runtime_error,以及更深继承的各个classes。
- C89程序库。
TR1组件实例:
- 智能指针(smart pointers)tr1::shared_ptr和tr1::weak_ptr。
- tr1::function, 此物得以表示任何callable entity(可调用物,也就是任何函数或函数对象),只要其签名符合目标。
- tr1::bind,它能够做STL绑定器(binders)bind1st和bind2nd所做的每一件事,而又更多。
把TR1组件划分为两组。第一组提供彼此互不相干的独立机能:
- Hash tables,用来实现sets,multisets,maps和multi-maps。
- 正则表达式(Regular expressions), 包括以正则表达式为基础的字符串查找和替换,或是从某个匹配字符串到另一个匹配字符串的逐一迭代(iteration)等等。
- Tuples(变量组),这是标准程序库中的pair template的新一代制品。
- tr1::array,本质上是个“STL化”数组,即一个支持成员函数如begin和end的数组。
- tr1::mem_fn,这是个语句构造上与成员函数指针(member function pointers)一致的东西。
- tr1::reference_wrapper,一个“让reference的行为更像对象”的设施。
- 随机数(random number)生成工具,它大大超越了rand,那是C++继承自C标准程序库的一个函数。
- 数学特殊函数,包括Laguerre多项式、Bessel函数、完全椭圆积分(complete elliptic integrals),以及更多数学函数。
- C99兼容扩充。
第二组TR1组件由更精巧的template编程技术构成:
- Type traits,一组traits classes,用以提供类型(types)的编译器信息。
- tr1::result_of,这是个template。用来推导函数调用的返回类型。
请记住:
- C++标准程序库的主要机能由STL、iostreams、locales组成。并包含C99标准程序库。
- TR1添加了智能指针、一般化函数指针、hash-based容器、正则表达式(regular expressions)以及另外10个组件的支持。
- TR1自身只是一份规范。为获得TR1提供的好处。你需要一份实物。一个好的实物来源是Boost。
条款55:让自己熟悉Boost
Boost程序库区分数十个类目,包括:
- 字符串与文本处理,覆盖具备类型安全(type-safe)的printf-like格式化动作、正则表达式,以及语汇单元切割(tokenizing)和解析(parsing)。
- 容器,覆盖“接口与STL相似且大小固定”的数组、大小可变的bitsets以及多维数组。
- 函数对象和高级编程。覆盖若干被用来作为TR1机能基础的程序库。
- 泛型编程(Generic programming),覆盖一大组traits classes。
- 模板元编程(Template metaprogramming,TMP),覆盖一个针对编译期assertions而写的程序库,以及Boost MPL程序库。
- 数学和数值(Math and numerics),包括有理数、八元数和四元数、常见的公约数和少见的多重运算、随机数。
- 正确性与测试(Correctness and testing),覆盖用来将隐式模板接口形式化的程序库,以及针对“测试优先”编程形态而设计的措施。
- 数据结构,覆盖类型安全的unions以及tuple程序库。
- 语言间的支持(Inter-language support),包括允许C++和Python之间的无缝互操作性。
- 内存,覆盖Pool程序库,用来做出高效率而区块大小固定的分配器,以及多边化的智能指针,包括TR1智能指针,
- 杂项,包括CRC校验、日期和时间的处理、在文件系统上来回移动等等。