typedefs h 資料型別 定義

2021-10-01 02:45:19 字數 3744 閱讀 9830

以前看到一些**這麼寫,還覺得多事。

心裡覺得大家都用int unsigned int 這些標準結構不就好了。各個編譯器都支援。

後來做了一些別的專案,接觸 了32位平台,64位平台,嵌入式,windows平台…就發現**的移植性太差了。

一旦結構體大小出錯,就非常容易出問題。

為了提高**的移植性,還是應該用這種型別定義。

另外,提及兩個注意事項:

結構體中不允許包含列舉型別,列舉在不同的平台中位元組數不一樣;

有些32位和64位平台遷移過程,在memcpy,malloc時,如果按照4位元組來操作,會掛死,盡量保證為8位元組倍數。

c語言主要有c89/c90,c99,c11這麼3個標準。

typedef可以對型別進行重新命名

typedef a b

其中a是一種已經已經定義的型別,b是我們要新增的定義。

可以:

typedef a b

typedef a c

即a可以用b也可以用c來表示。

也可以:

typedef a b

typedef b c

即a可以用b表示,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...