最近有看官問一些關於typedfe的問題,我在這裡專門做一個說明,希望對大家有幫助。
typedef是C語言的一個關鍵字,用來重新定義類型。通俗點說叫起別名或者起綽號也可以。
typedef通常有兩個功能:
為了程序簡潔易懂(可讀性好);為了避免程序出錯;關於簡潔易懂,我們舉一個例子:
typedef struct person
{
int age;
char *name;
char flag;
}Person;
在例子中定義了一個新的類型:Person.它和struct person的效果相同,在下面的代碼中
Person p1; //定義一個結構體變量
struct person p1; //定義一個結構體變量
在上面的例子中Person p1; 等價於 struct person p1.但是前面的寫法更加簡潔一些。
還記得是我們在前面的章回中介紹過後的函數;signal嗎?下面是signal函數的原型:
void (*signal(int signo, void (*func) (int))) (int)
我們可以定義一個新類型:
typedef void func (int);
它表示一個函數,該函數擁有一個int類型的參數,並且返回類型為void。定義好該類型後,函數signal的函數原型可以這樣寫:
func * signal (int signo, func *pFun); //使用typedef定義新類型後的signal函數
現在的signal函數是不是簡潔很多呢。
關於避免程序出錯,我們也舉一個例子:
#include
int main()
{
int *p1,p2;
int a,b;
a = 3;
b = 5;
p1 = &a;
p2 = &b;
printf("a = %d \n",*p1);
printf("b = %d \n",*p2);
return 0;
}
編譯上面的程序會有編譯警告和錯誤出現:
In function ‘main’:
typFile.c:12:5:
warning: assignment makes integer from pointer without a cast [enabled by default]
p2 = &b; //發出警告
typFile.c:15:21: error: invalid type argument of unary ‘*’ (have ‘int’)
printf("b = %d \n",*p2); //編譯錯誤
其實我們是想定義兩個int類型的指針,結果定義了一個指針,一個變量,為了避免這種錯誤,我們可以在程序中使用typedef來定義一個指針類型。具體如下:
#include
typedef int * pInt; //定義一個新的指針類型
int main()
{
pInt p1,p2; //使用新類型定義兩個指針
int a,b;
a = 3;
b = 5;
p1 = &a;
p2 = &b;
printf("a = %d \n",*p1);
printf("b = %d \n",*p2);
return 0;
}
編譯該程序,剛才的警告和錯誤沒有了,我們運行編譯後的程序可以得到以下結果:
a = 3
b = 5 //程序運行正確
各位看官,關於淺談typedef的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。