前面说明的编程习惯基本都是强制性的。但所有优秀的规则都允许例外,这里就是探讨这些特例。

10.1. 现有不合规范的代码

总述

  • 对于现有不符合既定编程风格的代码可以网开一面。

说明

  • 当你修改使用其他风格的代码时,为了与代码原有风格保持一致可以不使用本指南约定。如果不放心,可以与代码原作者或现在的负责人员商讨。记住,一致性也包括原有的一致性。

    10.2. Windows 代码

    总述

  • Windows程序员有自己的编程习惯,主要源于Windows头文件和其它Microsoft代码。我们希望任何人都可以顺利读懂你的代码,所以针对所有平台的C++编程只给出一个单独的指南。

说明

  • 如果你习惯使用Windows编码风格,这儿有必要重申一下某些你可能会忘记的指南:
    • 不要使用匈牙利命名法(比如把整型变量命名成iNum)。使用Google命名约定,包括对源文件使用.cc扩展名。
    • Windows定义了很多原生类型的同义词(YuleFox注:这一点,我也很反感),如DWORDHANDLE等等。在调用Windows API时这是完全可以接受甚至鼓励的。即使如此,还是尽量使用原有的C++类型,例如使用const TCHAR *而不是LPCTSTR
    • 使用Microsoft Visual C++进行编译时,将警告级别设置为3或更高,并将所有警告(warnings)当作错误(errors)处理。
    • 不要使用#pragma once;而应该使用Google的头文件保护规则。头文件保护的路径应该相对于项目根目录(Yang.Y注:如#ifndef SRC_DIR_BAR_H_,参考#define保护一节)。
    • 除非万不得已,不要使用任何非标准的扩展,如#pragma__declspec。使用__declspec(dllimport)__declspec(dllexport)是允许的,但必须通过宏来使用,比如DLLIMPORTDLLEXPORT,这样其他人在分享使用这些代码时可以很容易地禁用这些扩展。
  • 然而,在Windows上仍然有一些我们偶尔需要违反的规则:
    • 通常我们禁止使用多重继承,但在使用COM和ATL/WTL类时可以使用多重继承。为了实现COM或ATL/WTL类/接口,你可能不得不使用多重实现继承。
    • 虽然代码中不应该使用异常,但是在ATL和部分STL(包括VisualC++的STL)中异常被广泛使用。使用ATL时,应定义_ATL_NO_EXCEPTIONS以禁用异常。你需要研究一下是否能够禁用STL的异常,如果无法禁用,可以启用编译器异常。(注意这只是为了编译STL,自己的代码里仍然不应当包含异常处理)。
    • 通常为了利用头文件预编译,每个每个源文件的开头都会包含一个名为StdAfx.hprecompile.h的文件。为了使代码方便与其他项目共享,请避免显式包含此文件(除了在precompile.cc中),使用/FI编译器选项以自动包含该文件。
    • 资源头文件通常命名为resource.h且只包含宏,这一文件不需要遵守本风格指南。