@node Common Definitions, Memory Allocation, Error Reporting, Top
@chapter Common Definitions

There are some miscellaneous data types and macros that are not part of
the C language kernel but are nonetheless almost universally used, such
as the macro @code{NULL}.  In order to use these type and macro
definitions, your program should include the header file
@file{stddef.h}.
@pindex stddef.h

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

@comment stddef.h
@comment ANSI
@deftp {Data Type} size_t
This is an unsigned integer type used to represent the sizes of objects.
The result of the @code{sizeof} operator is of this type, and functions
such as @code{malloc} (@pxref{Unconstrained Allocation}) and
@code{memcpy} (@pxref{Copying and Concatenation}) that manipulate
objects of arbitrary sizes accept arguments of this type to specify
object sizes.
@end deftp

In the GNU system @code{size_t} is equivalent to one of the types 
@code{unsigned int} and @code{unsigned long int}.  These types have
identical properties on the GNU system, and for most purposes, you
can use them interchangeably.  However, they are distinct types, 
and in certain contexts, you may not treat them as identical.  For
example, when you specify the type of a function argument in a 
function prototype, it makes a difference which one you use.  If
the system header files declare @code{malloc} with an argument
of type @code{size_t} and you declare @code{malloc} with an argument
of type @code{unsigned int}, you will get a compilation error if
@code{size_t} happens to be @code{unsigned long int} on your system.
To avoid any possibility of error, when a function argument is
supposed to have type @code{size_t}, always write the type as
@code{size_t}, and make no assumptions about what that type might
actually be.

@strong{Compatibility Note:}  Types such as @code{size_t} are new
features of ANSI C.  Older, pre-ANSI C implementations have
traditionally used @code{unsigned int} for representing object sizes
and @code{int} for pointer subtraction results.

@comment stddef.h
@comment ANSI
@deftypevr Macro {void *} NULL
@cindex null pointer
This is a null pointer constant.  It can be assigned to any pointer
variable since it has type @code{void *}, and is guaranteed not to
point to any real object.  This macro is the best way to get a null
pointer value.  You can also use @code{0} or @code{(void *)0} as a null
pointer constant, but using @code{NULL} makes the purpose of the
constant more evident.  

When passing a null pointer as an argument to a function for which there
is no prototype declaration in scope, you should explicitly cast
@code{NULL} or @code{0} into a pointer of the appropriate type.  Again,
this is because the default argument promotions may not do the right
thing.
@end deftypevr

@comment stddef.h
@comment ANSI
@deftypefn {Macro} size_t offsetof (@var{type}, @var{member})
This expands to a integer constant expression that is the offset of the
structure member named @var{member} in a @code{struct} of type
@var{type}.  For example, @code{offsetof (struct s, elem)} is the
offset, in bytes, of the member @code{elem} in a @code{struct s}.  This
macro won't work if @var{member} is a bit field; you get an error from
the C compiler in that case.
@end deftypefn
