Ssize_t 與size_tlinux
跟蹤linux源碼獲得如下宏:函數
#ifndef _SIZE_Tpost
#define _SIZE_Tspa
typedef __kernel_size_t size_t;blog
#endif源碼
#ifndef _SSIZE_Tit
#define _SSIZE_Tio
typedef __kernel_ssize_t ssize_t;ioc
#endiffile
在不一樣平臺上,其具備不一樣的定義:
/* sparc 64 bit */
typedef unsigned long __kernel_size_t;
typedef long __kernel_ssize_t;
/* sparc 32 bit */
typedef unsigned int __kernel_size_t;
typedef int __kernel_ssize_t;
這就是兩個類型的實際定義,從字面上意思來講:
Ssize_t = signed size_t
使用位置:
在對於緩衝區大小等等非負值的長度時通常使用 size_t;
而對於像
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
可能失敗返回< 0的函數時,則使用ssize_t;
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
另外類似的一個類型: loff_t
定義以下:
#if defined(__GNUC__)
typedef __kernel_loff_t loff_t;
#endif
是一個long long 類型
#ifdef __GNUC__
typedef long long __kernel_loff_t;
#endif
注重細節,總有一天會成功!
————————————————————華麗的分割線————————————————————————————————
我的小總結:
size_t 爲 unsigned long/int 類型
ssize_t 爲 long/int 類型
總而言之 ssize_t = signed size_t
loff_t 爲 long long 類型