以前看到一些**這麼寫,還覺得多事。
心裡覺得大家都用int unsigned int 這些標準結構不就好了。各個編譯器都支援。
後來做了一些別的專案,接觸 了32位平台,64位平台,嵌入式,windows平台…就發現**的移植性太差了。
一旦結構體大小出錯,就非常容易出問題。
為了提高**的移植性,還是應該用這種型別定義。
另外,提及兩個注意事項:
結構體中不允許包含列舉型別,列舉在不同的平台中位元組數不一樣;c語言主要有c89/c90,c99,c11這麼3個標準。有些32位和64位平台遷移過程,在memcpy,malloc時,如果按照4位元組來操作,會掛死,盡量保證為8位元組倍數。
typedef可以對型別進行重新命名
typedef a b其中a是一種已經已經定義的型別,b是我們要新增的定義。
可以:
typedef a b即a可以用b也可以用c來表示。typedef a c
也可以:
typedef a b即a可以用b表示,b可以用c表示typedef b c
這種用法就太常用了,基本上一直在用
volatitle確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。
即表示有些值可能會意外的修改,不讓編譯器推斷之後就優化了。
常用來讀取記憶體等一些操作。
比如:
a = 1;
a = 2;
a = 3;
這是3個操作,但是編譯器有時會優化掉前兩條,直接跑a=3,如果需要都執行,就需要宣告volatile。
有時候處理器為了加快速度,會把值預先讀到暫存器裡,但是這個記憶體可能被其他執行緒使用了,修改了值,我們要修改後的值,就需要宣告
#ifndef typedefs_h
#define typedefs_h
#define __std_c99
/* note: 為了避免與系統定義的types衝突, 我們統一採用大寫字母開頭的組合, 不帶字尾 _t
* 若帶有volatile關鍵字的, 用小寫v開頭, 後續部分採用一致定義.
* 對volatile的書寫不做強制要求, 寫成vuint32/vuint32/volatile uint32/volatile uint32均可
* * 對於無符號數, uint32/vuint32 uint32/vuint32 均支援.
* * 特別注意int8型別和char型別的區分, c++ 不允許signed char 或 unsigned char 與 char 的相互強換.
*/#ifdef __std_c99__
#include /* using iso c99 standard */
typedef volatile int8_t vint8;
typedef volatile uint8_t vuint8;
typedef volatile uint8_t vuint8;
typedef volatile int16_t vint16;
typedef volatile uint16_t vuint16;
typedef volatile uint16_t vuint16;
typedef volatile int32_t vint32;
typedef volatile uint32_t vuint32;
typedef volatile uint32_t vuint32;
typedef volatile int64_t vint64;
typedef volatile uint64_t vuint64;
typedef volatile uint64_t vuint64;
/* * c++規定 char / unsigned char / signed char 為3種不同型別
* 字串預設是(char *)型別, 無法強轉為(signed char *)型別
* 為了相容這個特性, 特意封裝了char型別, 用於描述字串和字元
*/ typedef int8_t int8;
typedef uint8_t uint8;
typedef uint8_t uint8;
typedef int16_t int16;
typedef uint16_t uint16;
typedef uint16_t uint16;
typedef int32_t int32;
typedef uint32_t uint32;
typedef uint32_t uint32;
typedef int64_t int64;
typedef uint64_t uint64;
typedef uint64_t uint64;
#else /* 不支援c99標準, 即無法包含*/
typedef signed char int8;
typedef unsigned char uint8;
typedef unsigned char uint8;
typedef signed short int16;
typedef unsigned short uint16;
typedef unsigned short uint16;
typedef signed int int32;
typedef unsigned int uint32;
typedef unsigned int uint32;
typedef signed long long int64;
typedef unsigned long long uint64;
typedef unsigned long long uint64;
typedef volatile signed char vint8;
typedef volatile unsigned char vuint8;
typedef volatile unsigned char vuint8;
typedef volatile signed short vint16;
typedef volatile unsigned short vuint16;
typedef volatile unsigned short vuint16;
typedef volatile signed int vint32;
typedef volatile unsigned int vuint32;
typedef volatile unsigned int vuint32;
typedef volatile signed long long vint64;
typedef volatile unsigned long long vuint64;
typedef volatile unsigned long long vuint64;
#endif
typedef char char;
typedef void void;
typedef float float;
typedef double double;
#endif //typedefs_h
typedef用法
c語言標準
typedef定義資料型別
用typedef重新定義資料型別很常用 1.用typedef重新定義普通型別資料。typedef int count 將int重新命名為count typedef float score 將float重新命名為score 2,用typedef將為指標型別重新命名 typedef float poin...
定義blob型別 MySQL 資料型別
mysql 支援的資料型別很多,選用正確的資料型別至關重要。下面介紹常用的資料型別以及相應的優缺點。以上資料型別有可選的unsigned 屬性,表示不允許出現負值,但可以使上限提高一倍.例如 smallint unsigned 可儲存範圍為 0 65535 而 smallint 為 32768 32...
Oracle 內部定義 資料型別
資料型別 引數描述 char n n 1 to 2000位元組 定長字串,n位元組長,如果不指定長度,預設為1個位元組長 乙個漢字為2位元組 varchar2 n n 1 to 4000位元組 可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字 字母以及ascii碼字符集 或者ebcdi...