以下编程规范适用于本地 C++代码。
1.1 编译器选项
1.1.1 预编译头
ý 一定不要使用预编译头。
Visual C++ 项目默认使用预编译头文件。 其原理是当生成stdafx.h/cpp文件时,巨大的Windows 头文件只被编译一次。项目中其他任何一个.CPP 文件都需要首先包含 #include "stdafx.h" ,这样项目才能正确生成。当编译器找到 "stdafx.h"时,便知道何时插入预编译头信息。
在代码示例中,必须关闭预编译头选项。在您的项目属性中,找到C/C++ 标签页,选择 Precompiled headers 节点。点击 Not using precompiled headers 单选按钮,之后点击 OK。请确保修改了所有的配置(包括Debug配置 和Release配置)。之后,移除所有源文件的 #include<stdafx.h> 。
1.2 开启所有警告,并当做错误来对待
þ 您应该 以最高警告等级来编译所有代码。
þ 您应该 把警告当做错误来对待。
编译器提示的警告通常对于鉴别低劣的代码和隐晦的bug非常有用。您可以以编译器警告对您的代码进行额外的验证。
在Visual Studio中,您可以在项目的属性设置页面开启警告等级4。 在项目属性设置页面,找到 “Configuration Properties”, “C/C++”, “General” ,将“Warning Level” 设置为 “Level 4”。
1.2 文件和结构
1.2.1 stdafx.h, stdafx.cpp, targetver.h
þ 您应该 删除Visual Studio项目模板生成的 stdafx.h, stdafx.cpp 和 targetver.h 文件以保持示例的简洁。 然而,如果您有许多被大量代码文件共享的标准头文件,您可以创建单独的文件来包含它们。这非常类似于Windows.h的作用。
1.2.2 头文件
þ 一定请 在头文件内使用包含保护符(include guards),来防止头文件被无意的多次包含。
以下示例代码中的 #ifndef 和 #endif ,应该为头文件的第一行和最后一行代码。示例代码展示了如何在 “CodeExample.h”中使用 “#ifndef/#endif” 作为包含保护符。
// File header comment goes first ...
#ifndef CODE_EXAMPLE_H_
#define CODE_EXAMPLE_H_
class CodeExample
{
...
};
#endif
您也可以使用 “#pragma once” (微软编译器的一个特定拓展) 来替代 “#ifndef/#endif” 包含保护符:
// File header comment goes first ...
#pragma once
class CodeExample
{
...
};
ý 您不应该在头文件内实现函数。头文件只能包含函数声明和数据结构。它们的实现应置于.cpp 文件。
1.2.3 实现文件
实现文件包含了全局函数,局部函数和类方法实际的函数体。实现文件是拓展名为.c 或者 .cpp的文件。 注意,实现文件不必包含整个模块的完整实现。它可以被分隔,并包含一个公共内部接口。
þ 您应该 将不必导出的声明放置在实现文件中。此外,您应该为它们加上static关键字,以限制其作用域在该.cpp/.c 文件定义的编译单元。这将减少当链接2个或更多使用了相同内部变量的.cpp 文件时, 出现“multiply-defined symbol” 错误的情况。
其他更多示例看附件 All-In-One Code Framework 下载