在閱讀和使用C或C++源代碼時經常會遇到如下幾種與結構體有關的一般代碼:
typedef struct Man
{
int age;
int weight;
}MAN,*PMAN;//定義了兩個數據類型:MAN和PMAN。當然Man也是數據類型,而且Man和MAN就是一個東西,只不過MAN是Man的別名。
typedef struct
{
int age;
int weight;
}MAN;//定義了一個數據類型:MAN
struct Man
{
int age;
int weight;
}man,*pman;//定義了一個數據類型Man,另外聲明瞭一個Man類型的變量man和一個Man類型的指針
在沒有搞懂之前,每次遇到了它們,都需要複習一下。但是我們可以對他們理解一下的。首先我們可以用如下代碼定義一個“Man”結構體:
struct Man
{
int age;
int weight;
};
而類型定義符typdef的用法是給類型重新取一個有意義的名字,其用法:typedef 類型名 新類型名;。舉個例子:typedef int integer;//給int類型取一個名字叫integer
int main()
{
int a = 0;
integer b = 0;
if (a == b)//實際上a和b都是int
printf("a==b");
return 0;
}//這些代碼沒有語法錯誤
類型重定義的目的是使代碼更具有可讀性。然而typedef 類型名 新類型名;的類型名可不是一個必須存在的類型,也可以是一個當時聲明的類型。所以標準代碼寫法:typedef struct
{
int age;
int weight;
}MAN;
應該這樣看:typedef struct Man { int age; int weight; } MAN; //這樣寫不方便閱讀。
也可這麼看:
typedef struct { int age; int weight; } MAN; //相比上一行少了“Man”,因爲我們不會再使用Man這個類型
而如果你這樣寫:
typedef struct { int age; int weight; } ;//這樣寫沒有任何意義,因爲聲明的東西都沒有名字
所以,爲了方便代碼閱讀,我們應該按照標準代碼寫法那樣寫。所以帶typedef的結構體定義都可以這樣理解。
而不帶typedef的結構體定義後面寫的自然而然是變量的聲明。而且這個時候你必須寫結構體的名字。
struct _Man
{
int age;
int weight;
}MAN;
另外,union雖然不常用到,但是在閱讀代碼時還會經常遇到。union中的特點是成員數據只能選擇一個,但是union的大小以佔用內存最大的一個成員爲準。
union A{
int Flags;//佔4字節
char ExecuteOptions;//佔1字節
};
這裏union A佔4個字節,如果使用ExecuteOptions則只會使用第一個字節,如果使用的是Flags則使用的是整個的A的內存。但是我們一般不這麼用,而是讓union與struct一起組合使用。因爲這樣可以使代碼的編寫上更加方便,因爲可以在不影響代碼閱讀的基礎上使用的不同的方式訪問同一塊內存。
struct _File{
union{
struct{
int lowSize;
int HighSize;
};
long long fileSize;
};
char filename[260];
};
上述代碼中,我們定義了一個結構體_File,大小爲268個字節,對於前8個字節,我們定義了兩種方式進行訪問,一個是以高低4個字節方式訪問這8個字節,另一種直接以long long方式進行訪問這8個字節。
struct _FileAttribute{
union {
struct {
LONG AutoAlignment : 1;//佔1比特
LONG DisableBoost : 1;//佔1比特
LONG DisableQuantum : 1;//佔1比特
LONG ReservedFlags : 29;//佔29比特
};
LONG FileFlags;//32比特的統一名稱
};
char filename[260];
};
上述代碼,我們定義了一個佔用264字節的結構體_FileAttribute,它的前4個字節我們按照兩種方式訪問,第一種是以比特方式,另一種是以long類型字節訪問這是個字節。