[*_t]收集一些情报Part1: size_t, ssize_t, ptrdiff_t

To find where the header files located

headername=sys/types.h
echo "#include <${headername}>" | gcc -E -x c - | grep ${headername}

Headers

gnu_c - stddef.h: size_t/ssize_t/...
See “From gnu.org” - “Compatibility Note:”

unix - sys/types.h: ssize_t defined. size_t is from stddef.h

sys/types.h:
108:

ifndef __ssize_t_defined

typedef __ssize_t ssize_t;

define __ssize_t_defined

endif

145:

define __need_size_t

include





From Wiki
----
######Size and pointer difference types######

* Intro
The C language specification includes the typedefs `size_t` and `ptrdiff_t` to represent memory-related quantities. 
Their size is defined according to the target processor's arithmetic capabilities, not the memory capabilities, such as available address space. 
Both of these types are defined in the  header (cstddef header in C++).
* size_t
`size_t` is an unsigned integer type used to represent the size of any object (including arrays) in the particular implementation. 
The `sizeof()` operator yields a value of the type `size_t`. 
The maximum size of `size_t` is provided via `SIZE_MAX`, a macro constant which is defined in the  header (cstdint header in C++). 
`size_t` is guaranteed to be at least 16 bits wide. Additionally, ***POSIX*** includes **`ssize_t`**, which is a signed integral type of the same width as `size_t`.
* ptrdiff_t
`ptrdiff_t` is a signed integral type used to represent the difference between pointers. 
It is only guaranteed to be valid against pointers of the same type; subtraction of pointers consisting of different types is implementation-defined.(不同类型指针的减法运算是未明确定义的,也就是假如一个*char\**与一个*int\**作减法,天知道他们的结果是啥....)

From gnu.org
----------------
A.4 Important Data Types
The result of subtracting two pointers in C is always an integer, but the precise data type varies from C compiler to C compiler. Likewise, the data type of the result of sizeof also varies between compilers. ISO C defines standard aliases for these two types, so you can refer to them in a portable fashion. They are defined in the header file `stddef.h`

* Data Type: **ptrdiff_t**
This is the signed integer type of the result of subtracting two pointers. For example, with the declaration char *p1, *p2; the expression p2 - p1 is of type ptrdiff_t. 
This will probably be one of the standard signed integer types (short int, int or long int), but might be a nonstandard type that exists only for this purpose.

* Data Type: **size_t**
This is an unsigned integer type used to represent the sizes of objects. The result of the sizeof operator is of this type, and functions such as malloc(see Unconstrained Allocation) and memcpy(see Copying Strings and Arrays) accept arguments of this type to specify object sizes. On systems using the GNU C Library, this will be unsigned int or unsigned long int.

* **Usage Note:** 
size_t is the preferred way to declare any arguments or variables that hold the size of an object.

* **Compatibility Note:** 
Implementations of C before the advent of ISO C generally used unsigned int
 for representing object sizes and int for pointer subtraction results. They did not necessarily define either size_t or ptrdiff_t. Unix systems did define size_t
, in sys/types.h, but the definition was usually a signed type.

你可能感兴趣的:([*_t]收集一些情报Part1: size_t, ssize_t, ptrdiff_t)