C++的文件结构
在C/C++中通常都存在两个文件。
- 头文件以.h为后缀的,用于保存程序的声明。
- 定义文件或源文件以.cpp等形式存在,用于保存程序的实现。
头文件
头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。
头文件由三个部分组成:
(1) 开头的版权和声明。(主要体现文件的版本信息,例如完成时间、作者、摘要介绍等)
(2) 预处理块。(引入头文件、全局函数、宏定义等)
(3) 函数与类结构声明等。
● 【规则 1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预
处理块。
● 【规则 2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
● 【规则 3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)
#ifndef GPS_H // 防止 GPS.h 被重复引用
#define GPS_H
#include <math.h> // 引用标准库的头文件
#include “myheader.h” // 引用非标准库的头文件
void Function1(…); // 全局函数声明
class Box // 类结构声明
{
…
};
#endif
● 【建议 1】 在有多个 .h 文件和多个 .c 文件的时候,可以使用一个 global.h 的头文件来包括所有的 .h 文件,然后在除 global.h 文件外的头文件中包含 global.h 就可以实现所有头文件的包含,同时不会乱。方便在各个文件里面调用其他文件的函数或者变量。
定义文件或源文件
定义文件有三部分内容:
(1) 定义文件开头处的版权和版本声明(参见示例 1-1)。
(2) 对一些头文件的引用。
(3) 程序的实现体(包括数据和代码)
#include “GPS.h” // 引用头文件
// 全局函数的实现体
void Function1(…)
{
…
}
// 类成员函数的实现体
void Box::Draw(…)
{
… }
共性命名规则
直到现在应该不存在大家都认同的一种命名规则,那就总结一些应该是的共性规则。
● 【1】标识符应当直观且可以拼读,可望文知意。标识符采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。
● 【2 】标识符的长度应适当不可太长。单字符的名字也是有用的,常见的i,j,k,m,n,x,y,z 等,它们通常可用作函数内的局部变量。
● 【3 】尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需要编号。
● 【4 】类名和函数名用大写字母开头的单词组合而成。
例如:class Node; void Draw(void);
● 【5 】变量和参数用小写字母开头的单词组合而成。
例如:BOOL flag; int drawMode;
● 【6 】常量全用大写的字母,用下划线分割单词。
例如:const int MAX = 100; const int MAX_LENGTH = 100;
● 【7 】静态变量加前缀 s_(表示 static)
例如:static int s_initValue; // 静态变量
● 【8 】要全局变量,则使全局变量加前缀 g_(表示 global)。
例如:int g_howManyPeople; // 全局变量
● 【9 】类的数据成员加前缀 m_(表示 member),这样可以避免数据成员与成员函数的参数同名。
表达式和基本语句
运算符的优先级
● 【1 】由于将表中内容熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。
例如:word = (high << 8) | low;if ((a | b) && (a & c));
if语句
● 【1 】不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较。
例如:if (flag) 、if (!flag) // 正确写法 if (flag == TRUE)、if (flag == 1 ) // 不正确写法
● 【2 】应当将整型变量用“”或“!=”直接与 0 比较。以免被认为是布尔变量。
例如:if (value == 0) // 正确写法 if (value) // 不正确写法
● 【3 】不可将浮点变量用“”或“!=”与任何数字比较。
例如:if (x == 0.0) // 隐含错误的比较,应转化为
if ((x>=-EPSINON) && (x<=EPSINON)) 其中 EPSINON 是允许的误差(即精度)。
● 【4 】应当将指针变量用“==”或“!=”与 NULL 比较。尽管 NULL 的值与 0 相同,但是两者意义不同。
goto语句
由于 goto 语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格。其次,goto 语句经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。
goto state;
String s1, s2; // 被 goto 跳过
int sum = 0; // 被 goto 跳过 …
state:
…
但goto在一些应用场合却能大显神通,节约资源。