最近,在學習Linux信號量時,看到signal函數中typedef的一個用法,覺得很有意思。於是就拿出來說道說道。
它定義了一個類型sighandler_t,表示指向返回值爲void型(參數爲int型)的函數(的)指針。它可以用來聲明一個或多個函數指針。
sighandler_t sig1, sig2; 這個聲明等價於下面這種晦澀難懂的寫法:
void (*sig1)(int), (*sig2)(int);
1. 關於typedef
typedef作爲類型定義關鍵字,用於在原有數據類型(基本類型、構造類型、指針等)的基礎上,由用戶自定義新的類型名稱。typedef聲明不是用於創建一個新類型,而是爲某個已經存在的類型增加一個新的名字罷了。
一般,使用typedef定義另一個名稱是出於可移植性的考慮。這個在嵌入式編程中使用較多。比如,某些基本數據類型在不同的處理器中的表示位數可能不同,如果要將程序移植到另一種體系結構的處理器上工作,那麼勢必要修改大量的代碼而且容易出錯。如果將它取一個新名稱,然後在程序中使用新的名稱來表示,那麼移植的工作僅僅只是修改定義這些新名詞即可。比如,只需將typedef int INT16; 替換成 typedef short INT16; 和 typedef short INT16; 替換成 typedef int INT32; 即可。
在變量定義的前面加上typedef,即可定義該變量的類型。比如, long count; 這裏定義了一個長整型變量count,當加上typedef後, typedef long count; 那麼count就成爲了long類型。
在這裏,typedef void (*sighandler_t)(int) 也可以寫成void (*sighandler_t)(int),typedef 在語句中所起的作用不過就是把語句原先定義變量的功能變成了定義類型的功能而已。
2. #define和typedef
#define和typedef的作用看起來很像,不過差別缺很大。#define僅在預處理時對代碼進行簡單的字符串替換處理,不作正確性檢查,不關含義是否正確照樣替換;而typedef是在編譯時處理,它建立了一個新的數據類型別名。一般來說,最好使用typedef定義用戶類型,部分原因是它能正確處理指針類型。