#### 2.3.1 Primitive Types ¶

`Libffi` provides a number of built-in type descriptors that can be used to describe argument and return types:

`ffi_type_void` ¶

  The type `void`. This cannot be used for argument types, only for return values.

`ffi_type_uint8` ¶

  An unsigned, 8-bit integer type.

`ffi_type_sint8` ¶

  A signed, 8-bit integer type.

`ffi_type_uint16` ¶

  An unsigned, 16-bit integer type.

`ffi_type_sint16` ¶

  A signed, 16-bit integer type.

`ffi_type_uint32` ¶

  An unsigned, 32-bit integer type.

`ffi_type_sint32` ¶

  A signed, 32-bit integer type.

`ffi_type_uint64` ¶

  An unsigned, 64-bit integer type.

`ffi_type_sint64` ¶

  A signed, 64-bit integer type.

`ffi_type_float` ¶

  The C `float` type.

`ffi_type_double` ¶

  The C `double` type.

`ffi_type_uchar` ¶

  The C `unsigned char` type.

`ffi_type_schar` ¶

  The C `signed char` type. (Note that there is not an exact equivalent to the C `char` type in `libffi`; ordinarily you should either use `ffi_type_schar` or `ffi_type_uchar` depending on whether `char` is signed.)

`ffi_type_ushort` ¶

  The C `unsigned short` type.

`ffi_type_sshort` ¶

  The C `short` type.

`ffi_type_uint` ¶

  The C `unsigned int` type.

`ffi_type_sint` ¶

  The C `int` type.

`ffi_type_ulong` ¶

  The C `unsigned long` type.

`ffi_type_slong` ¶

  The C `long` type.

`ffi_type_longdouble` ¶

  On platforms that have a C `long double` type, this is defined. On other platforms, it is not.

`ffi_type_pointer` ¶

  A generic `void *` pointer. You should use this for all pointers, regardless of their real type.

`ffi_type_complex_float` ¶

  The C `_Complex float` type.

`ffi_type_complex_double` ¶

  The C `_Complex double` type.

`ffi_type_complex_longdouble` ¶

  The C `_Complex long double` type. On platforms that have a C `long double` type, this is defined. On other platforms, it is not.

Each of these is of type `ffi_type`, so you must take the address when passing to `ffi_prep_cif`.