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 宣告也沒有增加任何新的語義,通過這種方式宣告的變數與通過普通方式宣告的變數具有完...