C 語言程式設計 typedef 關鍵字

2021-10-07 08:37:44 字數 1944 閱讀 9851

typedef 和 const 結合使用的陷阱

typedef 顧名思義,主要用於自定義乙個資料型別,而資料型別在**中的體現為 「名字」,所以 typedef 一般的理解是為乙個資料型別或變數定義乙個別名

typedef

unsigned

char uint8;

typedef

unsigned

short uint16;

typedef

unsigned

int uint32;

typedef

signed

char int8;

typedef

signed

short int16;

typedef

signed

int int32;

typedef

float float;

typedef

double double;

typedef

char char;

typedef

struct

******2;

上述例子中結構體是沒有宣告名字的,所以稱之為 「無名結構體定義」。但 typedef 的存在,又讓我們得到了乙個 「別名」,實際上只是單存的在**的書寫上帶來了便利而已。

#include

typedef

int* pint;

intmain

(void

)

編譯報錯:

$ gcc test3.c -o test3

test3.c: 在函式『main』中:

test3.c:13:5: 錯誤:向唯讀位置『*c』賦值

*c = 43;

^

這個錯誤很好理解,因為整型常量 c 指向的數值是不可變的,所以為 「唯讀」 位置。

但為什麼使用了語句const pint b = &a;卻不會編譯錯誤呢?如果我們把編譯錯誤的語句注釋掉之後,程式甚至還可以執行:

$ ./test3

the *b is 8

從結果看出,我們預期的常量被修改了。實際上,我們應該把const pint b = &a看成int* const b = &a,這條語句並非 「整型常量 b 被賦值了」 而是 「變數 b 的指標是乙個常量,變數 b 被賦值了」。

這裡就是陷阱了,當 typedef 和 const 結合使用時,尤其是在指標場景中,一律認為是定義乙個指標常量,而非常量。下列兩種寫法其實是一致的:

const pint b =

&a;pint const c =

&a;

如果我們非要這麼使用的話,那麼就用 typedef 將 const 一併宣告了:

typedef

const

int* pint;

pint b =

&a;

(C語言)typedef關鍵字

typedef 定義 c 語言提供了typedef關鍵字,您可以使用它來為型別取乙個新的名字。下面的例項為單位元組數字定義了乙個術語byte typedef unsigned char byte 在這個型別定義之後,識別符號 byte 可作為型別unsigned char的縮寫,例如 byte b1...

C語言的 typedef 關鍵字

typedef 是 c 語言的關鍵字,用於宣告基本資料型別的別名 如 typedef int a 則宣告了乙個 int 型別的別名 a,這個 a 不再是乙個變數,而是 int 的別名,可以用 a 來代替 int 來宣告其他整形變數,如 a name 就是宣告了乙個整形變數 name 型別別名和型別名...

C語言之關鍵字typedef

c語言提供了乙個 型別定義 的功能 typedef 用此來建立新的資料型別名。需要強調的是,從任何意義上來講,typedef 的宣告並沒有建立乙個新的型別,它只是為某個已經存在的型別增加乙個新的名稱而已。typedef 宣告也沒有增加任何新的語義,通過這種方式宣告的變數與通過普通方式宣告的變數具有完...