頭文件的作用
申明將被程序用到的函數(shù)、變量和定義類型(包括:常量、類定義、模板定義……)
正確使用頭文件
第1點(diǎn):
頭文件中應(yīng)該只包含函數(shù)和變量的申明,而不是定義。
例如:
在 main.cpp中
int mousex;
在 headers.h 中
extern int mousex;
如果多個cpp文件include了一個定義了變量的頭文件,那么你將看到下面的錯誤信息
"error LNK2005: "int mousex" (?mousex@@3HA) already defined in headers.obj"
第2點(diǎn):
在定義變量的地方初始化它們的值,而不是在申明它們的地方
例如:
在 main.cpp中
int mousey=0;
在 headers.h中
extern int mousey;
如果在頭文件中初始化變量,那么編譯器會認(rèn)為這是一個定義,于是出現(xiàn)如下的錯誤信息:
"error C2086: 'int mousey' : redefinition"
第3點(diǎn):
為了避免重定義,最好把頭文件用以下的定義包含起來(現(xiàn)在編譯器如VC++.net也可以用#pragma once代替)
#ifndef __HEADERS_H__
#define __HEADERS_H__
.
code
.
#endif __HEADERS_H__
匈牙利命名法
為了幫助程序員記憶變量的類型,Charles Simonyi發(fā)明了匈牙利命名法。使用它可以一目了然的在浩瀚的代碼海洋中識別出變量的類型。
前綴
|
類型
|
例如
|
b
|
布爾型
|
bGameOver
|
by
|
Byte或Unsigned Char
|
byChoice
|
c
|
Char
|
cYesNo
|
cx / cy
|
尺寸
|
cxWidth
|
dw
|
DWORD, Double Word 或Unsigned Long
|
dwCounter
|
fn
|
函數(shù)
|
fnGetMeOver
|
h
|
Handle
|
hWindow
|
i
|
int (Integer)
|
iCounter
|
l
|
Long
|
lCounter
|
n
|
Short int
|
nChange
|
p
|
指針
|
pMakeChoice
|
s
|
String
|
sName
|
sz
|
以0結(jié)尾的字符串
|
szName
|
w
|
WORD Unsigned int
|
wCounter
|
x, y
|
坐標(biāo)
|
x
|
文字間隔
文字的間隔對程序的結(jié)構(gòu)和可讀性非常重要
下面的兩段程序哪個更容易讀懂?
main()
{
char name[32]={"Red Cow Likes Milk"};
for(int t=0;t<16;t++)
{
t+=1;
for(int j=0;j<16;j++)
{
cout<<name[j];
}
cout<<name[t];
}
}
或
main()
{
char name[32] = {"Red Cow Likes Milk"};
for( int t = 0; t < 16; t++ )
{
t+=1;
for( int j = 0; j < 16; j++)
{
cout<<name[j];
}
cout<<name[t];
}
}
接下來繼續(xù)看
一行代碼中的間隔
好的風(fēng)格:
my.problem = FunkyG( my.bag + my.pipe * my.time);
不好的風(fēng)格:
my.problem=FunkyG(my.bag+my.pipe*my.time);
變量名
選擇最能說明變量作用的名字,如:
fMoneyAmount
fHitPoints
vDirection
但如果去掉字母中的元音后
fMnyAmnt
fHtPnts
vDirctn
非常混淆不是嗎?還不如試試只用前三個字母
vDirctn
= vDir
過長的變量或函數(shù)名也是不可取的(有時簡直就是噩夢)
void RotationToFloatAngleDegreeDirection(float fRotation, Vector_t * vDirection); // 不好
void RotationToDirection(float fRotation, Vector_t * vDirection); // 好
或
void TheFunctionThatSetsAVariableAlwaysToZero(int * iVar); // 不好
void VarToZero(int * iVar); // 好
或
float TimeInCanadiaInHours(); // 不好
float Time_Canadia(); // 好
在程序中定義變量
全局變量:
議盡可能少用全局變量,因?yàn)椴徽_的是用很容易引起和局部變量的混淆,如:
int j=756;
void printJandQ(int Q)
{
int j=0;
cout << j << q;
}
局部變量的定義:
盡量不要在函數(shù)中間定義變量,這會導(dǎo)致可讀性的下降和變量作用范圍的混淆,在每個函數(shù)的開始處定義它的局部變量。(譯者注:對于這條建議本人持保留態(tài)度)
靜態(tài)分配和動態(tài)分配:
不好的風(fēng)格:
struct DosFile_t
{
char * name;
int id;
}
如果一個字符串的長度有限制最好使用靜態(tài)分配,如下:
struct DosFile_t
{
char name[8];
int id;
}
在初始化變量時不要忘記付值:
不要認(rèn)為一個變量在定義出來后就已經(jīng)被付值為0了,記住手動付0給它們,如果是結(jié)構(gòu)就用memset將其全部清0
int j=0;
DosFile_t * dfFileList;
dfFileList=(dfFile*)malloc(sizeof(dfFileList)*8);
memset(dfFile,0, sizeof(dfFileList)*8);