一、关于#pragma pack(n)
不同平台上的编译器都有自己的默认“对齐系数”,也称对齐模数。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
在windows(32)/VC6.0下,n的取值可以为1、2、4、8,默认情况下为8。在linux(32)/GCC下,n的取值只能为1、2、4,默认情况下为4。
pack后面的n值,就是结构体对齐规则里面的对其系数。
#pragma pack(n)使用情景有牵扯到网络协议方面,或者存盘数据,其作用就是:保证在不同的平台下面,所定义的结构大小是一致的。
二、尽可能使用定长的数据类型
因为牵扯到平台移植的问题,为了尽可能的避免不同的数据类型在不同的平台中数据大小不一样,比如:char类型数据在32位和64位系统中都是8位,但是long在32位中大小是:32位,在64位的系统中是64位,使用char类型就可以更大限度避免平台不同而引起的问题。
三、goto语句的使用
尽管在课本中多次提到goto语句会让程序显的杂乱无章,但是通常情况下,在实际的开发过程中,函数要保证单入口单出口,也就是只有一个return语句兰进行结果的返回。
普遍函数程序:
bool function(int a,int b)
{
if(a < 0 || b<0)
{
return false;
}
int c = a*b;
if(c <=0)
{
return false;
}
return true;
}
每一次判断之后结果或者参数是否合法之后,就会有一个包含有return关键字条件判断,这样程序就会有很多出口,如果出现错误就会很难排查。
但是使用goto语句之后:
void Error_Check(int ret)
{
if(ret == false)
goto:Exit0;
}
bool function(int index1,int index2)
{
Error_Check(index1 || index2 );
int cnt = index1*index2;
Error_Check(cnt);
Exit0:
return false;
}
我们将错误检测封装起来,在错误检测中,如果我们有检测到错误,我们可以生成日志或者打印,然后使用goto语句直接跳转,这样,所有的错误检测之后的返回处理都会在Exit0处执行。保证了函数的单出口,代码也会更简洁。
四、函数的返回值
开发过程中返回值通常设定为bool变量,因为bool变量只有两个值:true和false,也就是执行成功或者失败。通常会设置成int,因为int里面。如果返回:1代表一种情况,返回:2又代表一种情况,而我们使用bool之后,所有的情况我们都会在函数的内部处理,参数也会设置称输出型参数,这样外部接受的结果就只有正确与否。
五、初始化
变量的定义和初始化都会放在开始,中间是数据的处理,最后是错误的处理和返回,大概结构如下:
bool function()
{
//变量的初始化
...
//数据的处理
...
//错误的处理以及返回
...
return true;
}
六、类里面函数声明放在.h文件,函数的具体实现放在.cpp文件
实际开发过程中,一个类里面的类成员函数可以有很多,所以如果没有声明的话,可读性不是很好,因为如果非开发者使用这个类,可能他并不需要了解函数里面是怎么声明的,只需要使用和得到返回值就行,所以声明和实现是分开的。
声明放在.h文件中的话,编译器可以实现优化。
如果有情况我们会把实现就放在.h文件中,有可能是因为函数功能过于简单,或者是语法规定不允许分开,比如:模板类
七、接口和实现分开
通常在开发出功能齐全的成品的时候,我们可能只是希望使用者我们提供的功能,并不希望其看到内部的结构或者源代码。所以此时我们将借口和实现分开,使用的时候只需提供一套借口就行。
这样子也比较符合:高内聚,低耦合的编程思想。
八、尽量少的使用宏,最好使用公共函数
如果使用的宏过多的话,最大的问题就时调试起来特别困难,不方便维护。