【摘要】 本文主要分析比較typedef和define關鍵字,在概念與使用方法上相似處與差異。并給出typedef在結構體定義上應該注意的問題,define在使用上的值得改進的方向。詳述如下。 【正文】
- typedef
- typedef 目的
在程式設計中使用typedef目的一般有兩個,一個是給變量一個易記且意義明确的新名字,另一個是簡化一些比較複雜的類型聲明。
-
- typedef 定義
typedef 為C語言的關鍵字,作用是為一種資料類型定義一個新名字。這裡的資料類型包括内部資料類型(int,char等)和自定義的資料類型 (struct等)。
-
- typedef 使用形式
typedef 已有類型 新類型
1、typedef的最簡單使用
typedef long byte_4; // 給已知資料類型long起個新名字,叫byte_4。2、 typedef與結構結合使用
typedef struct tagMyStruct
{int iNum;long lLength;} MyStruct;
這語句實際上完成兩個操作:
1) 定義一個新的結構類型
struct tagMyStruct{int iNum;long lLength;};
分析:tagMyStruct 稱為“tag”,即“标簽”,實際上是一個臨時名字,struct 關鍵字和tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。我們可以用struct tagMyStruct varName來定義變量,但要注意,使用tagMyStruct varName來定義變量是不對的,因為struct 和tagMyStruct合在一起才能表示一個結構類型。
2) typedef為這個新的結構起了一個名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
是以,MyStruct實際上相當于struct tagMyStruct,我們可以使用MyStruct varName來定義變量。
typedef struct {int data;int text;} S1;//這種方法可以在c或者c++中定義一個S1結構
struct S2 {
int data;int text;
};// 這種定義方式隻能在C++中使用,而如果用在C中,那麼編譯器會報錯struct {
int data;int text;
} S3; // 這種方法并沒有定義一個結構,而是定義了一個s3的結構變量,編譯器會為s3記憶體。
3、 typedef使用中應該注意的幾個問題首先,在C中定義 一個結構體類型要用typedef:
typedef struct Student{int a;}Stu;
在聲明變量的時候就可:Stu stu1;如果沒有typedef就必須用struct Student stu1;來聲明,這裡的 Stu實際上就是struct Student的别名。另外這裡也可以不寫Student(于是也不能struct Student stu1;了)
typedef struct{int a;}Stu;
但在c++裡很簡單,直接
struct Student{int a;};
于是就定義了結構體類型Student,聲明變量時直接Student stu2;===========================================其次,在c++中如果用typedef的話,又會造成差別:
struct Student{
int a;
}stu1;//stu1是一個變量typedef struct Student2{
int a;
}stu2;//stu2是一個結構體類型
使用時可以直接通路stu1.a,但是,stu2則必須先 stu2 s2;然後 s2.a=10;
- define
- define的概念
宏定義,儲存在預編譯器的符号表中,執行高效;作為一種簡單的符号替換,不進行其中參數有效性的檢測
#define 宏名 要替換的代碼本質:替換功能,define的東西在編譯的時候會執行替換動作。1.簡單的#define定義“全局變量”2.define的“函數定義”3。宏的單行定義4。取消宏#undef5。為了避免重複包含(重複定義), 在一個.h檔案開頭會使用 #define ×××來定義。
-
- define的使用
盡量以 const, enum, inline 替換 #define;對單純常量,最好以 const 對象 或 enums 替換 #define;對于形似函數的宏 macros, 最好改用 inline 函數替換 #define。