前面说明的编程习惯基本都是强制性的. 但所有优秀的规则都允许例外, 这里就是探讨这些特例.
## 9.1. 现有不合规范的代码
> Tip
> 对于现有不符合既定编程风格的代码可以网开一面.
当你修改使用其他风格的代码时, 为了与代码原有风格保持一致可以不使用本指南约定. 如果不放心可以与代码原作者或现在的负责人员商讨, 记住, _一致性_ 包括原有的一致性.
## 9.2. Windows 代码
> Tip
> Windows 程序员有自己的编程习惯, 主要源于 Windows 头文件和其它 Microsoft 代码. 我们希望任何人都可以顺利读懂你的代码, 所以针对所有平台的 C++ 编程只给出一个单独的指南.
如果你习惯使用 Windows 编码风格, 这儿有必要重申一下某些你可能会忘记的指南:
>
> - 不要使用匈牙利命名法 (比如把整型变量命名成 `iNum`). 使用 Google 命名约定, 包括对源文件使用 `.cc` 扩展名.
> - Windows 定义了很多原生类型的同义词 (YuleFox 注: 这一点, 我也很反感), 如 `DWORD`, `HANDLE` 等等. 在调用 Windows API 时这是完全可以接受甚至鼓励的. 但还是尽量使用原有的 C++ 类型, 例如, 使用 `const TCHAR *` 而不是 `LPCTSTR`.
> - 使用 Microsoft Visual C++ 进行编译时, 将警告级别设置为 3 或更高, 并将所有 warnings 当作 errors 处理.
> - 不要使用 `#pragma once`; 而应该使用 Google 的头文件保护规则. 头文件保护的路径应该相对于项目根目录 (yospaly 注: 如 `#ifndef SRC_DIR_BAR_H_`, 参考 [#define 保护](#) 一节).
> - 除非万不得已, 不要使用任何非标准的扩展, 如 `#pragma` 和 `__declspec`. 允许使用 `__declspec(dllimport)` 和 `__declspec(dllexport)`; 但你必须通过宏来使用, 比如 `DLLIMPORT` 和 `DLLEXPORT`, 这样其他人在分享使用这些代码时很容易就去掉这些扩展.
在 Windows 上, 只有很少的一些情况下, 我们可以偶尔违反规则:
>
> - 通常我们 [禁止使用多重继承](#), 但在使用 COM 和 ATL/WTL 类时可以使用多重继承. 为了实现 COM 或 ATL/WTL 类/接口, 你可能不得不使用多重实现继承.
> - 虽然代码中不应该使用异常, 但是在 ATL 和部分 STL(包括 Visual C++ 的 STL) 中异常被广泛使用. 使用 ATL 时, 应定义 `_ATL_NO_EXCEPTIONS` 以禁用异常. 你要研究一下是否能够禁用 STL 的异常, 如果无法禁用, 启用编译器异常也可以. (注意这只是为了编译 STL, 自己代码里仍然不要含异常处理.)
> - 通常为了利用头文件预编译, 每个每个源文件的开头都会包含一个名为 `StdAfx.h` 或 `precompile.h` 的文件. 为了使代码方便与其他项目共享, 避免显式包含此文件 (`precompile.cc`), 使用 `/FI` 编译器选项以自动包含.
> - 资源头文件通常命名为 `resource.h`, 且只包含宏的, 不需要遵守本风格指南.
- Google 开源项目风格指南 (中文版)
- C++ 风格指南
- 0. 扉页
- 1. 头文件
- 2. 作用域
- 3. 类
- 4. 来自 Google 的奇技
- 5. 其他 C++ 特性
- 6. 命名约定
- 7. 注释
- 8. 格式
- 9. 规则特例
- 10. 结束语
- Objective-C 风格指南
- Google Objective-C Style Guide 中文版
- 留白和格式
- 命名
- 注释
- Cocoa 和 Objective-C 特性
- Cocoa 模式
- Python 风格指南
- Google Python 风格指南 - 中文版
- 背景
- Python语言规范
- Python风格规范
- 临别赠言
- JSON 风格指南
- 简介
- 定义
- 一般准则
- 属性名准则
- 属性值准则
- 属性值数据类型
- JSON结构和保留属性名
- 顶级保留属性名称
- data对象的保留属性名
- 用于分页的保留属性名
- 用于链接的保留属性名
- 错误对象中的保留属性名
- 属性顺序
- 示例
- 附录