typedef不常見但值得一提的用途:
1. 用typedef來定義與平台無關的型別。
比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為:
typedef long double real;
在不支援 long double 的平台二上,改為:
typedef double real;
在連 double 都不支援的平台三上,改為:
typedef float real;
也就是說,當跨平台時,只要改下 typedef 本身就行,不用對其他原始碼
做任何修改。
標準庫就廣泛使用了這個技巧,比如size_t。
另外,因為typedef是定義了一種型別的新別名,不是簡單的字串替換。
2.為複雜的宣告定義乙個新的簡單的別名。
方法是:在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。
舉例:(1). 原宣告:int *(*a[5])(int, char*);
變數名為a,直接用乙個新別名pfun替換a就可以了:
typedef int *(*pfun)(int, char*);
原宣告的最簡化版:
pfun a[5];
(2). 原宣告:void (*b[10]) (void (*)());
變數名為b,先替換右邊部分括號裡的,pfunparam為別名一:
typedef void (*pfunparam)();
再替換左邊的變數b,pfunx為別名二:
typedef void (*pfunx)(pfunparam);
原宣告的最簡化版:
pfunx b[10];
(3). 原宣告:doube(*)() (*e)[9];
變數名為e,先替換左邊部分,pfuny為別名一:
typedef double(*pfuny)();
再替換右邊的變數e,pfunparamy為別名二
typedef pfuny (*pfunparamy)[9];
原宣告的最簡化版:
pfunparamy e;
理解複雜宣告舉例:
int (*func)(int *p);
func是乙個函式指標,這類函式具有int*型別的形參,返回值型別是int。
int (*func[5])(int *);
func右邊是乙個運算子,說明func是具有5個元素的陣列;func的左邊有乙個*,說明func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的,原因是運算子優先順序比*高,func先跟結合)。跳出這個括號,看右邊,又遇到圓括號,說明func陣列的元素是函式指標,它指向的函式具有int*型別的形參,返回值型別為int。
記住2個模式:
type (*)(....)-->函式指標
type (*) -->陣列指標
其他:1. typedef char * pstr;
char string[4] = "abc";
const char *p1 = string;
const pstr p2 = string;
p1++;
//p2++;
p2++編譯出錯。typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。
按照順序,『const pstr』被解釋為『char * const』(乙個指向 char 的常量指標),而不是『const char *』(指向常量 char 的指標)。這個問題很容易解決:
typedef const char * cpstr; int mystrcmp(cpstr, cpstr); // 現在是正確的記住:不管什麼時候,只要為指標宣告 typedef,那麼都要在最終的 typedef 名稱中加乙個 const,以使得該指標本身是常量,而不是物件。
2. typedef 和儲存
類關鍵字
typedef 就像 auto,extern,mutable,static,和 register 一樣,是乙個儲存類關鍵字。這並不是說 typedef 會真正影響物件的儲存特性,只是在語句構成上,typedef 宣告看起來象 static,extern 等型別的變數宣告。下面將帶到第二個陷阱:
typedef register int fast_counter; // 錯誤編譯通不過。問題出在你不能在宣告中有多個儲存類關鍵字。因為符號 typedef 已經佔據了儲存類關鍵字的位置,在 typedef 宣告中不能用 register(或任何其他儲存類關鍵字)。
趣味程式設計6 c
高次方數的尾數 求13的13次方的最後三位數。問題分析與演算法設計 解本題最直接的方法是 將13累乘13次後擷取最後三位即可。但是由於計算機所能表示的整數範圍有限,用這種 正確 的演算法 不可能得到正確的結果。事實上,題目僅要求後三位的值,完全沒有 必要求13的13次方的完整結果。研究乘法的規律會發...
《C專家程式設計》筆記6
第六章 運動的詩章 執行時資料結構 a.out 它是assembler output 的縮寫形式 a.out 這個名字是unix 沒什麼理由,但我們就是這麼做的 思維的一例 超級塊 superblock unix 檔案系統中的基礎資料結構 就是用下面這個神奇數字唯一標識的 define ps mag...
C 總複習6 C 程式設計 智慧型指標
1.auto ptr 2.unique ptr 3.shared ptr 4.weak ptr 5.scoped ptr newdelete 容易出現記憶體洩漏 解決方法 自主的記憶體 機制 人為開闢 系統釋放 int p new int 所有權交給棧上的乙個變數 棧 系統開闢 系統釋放 堆 人為開...