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.