#### 2.3.6 Complex Types ¶

`libffi` supports the complex types defined by the C99 standard (`_Complex float`, `_Complex double` and `_Complex long double` with the built-in type descriptors `ffi_type_complex_float`, `ffi_type_complex_double` and `ffi_type_complex_longdouble`.

Custom complex types like `_Complex int` can also be used. An `ffi_type` object has to be defined to describe the complex type to `libffi`.

Data type: ffi_type ¶
  `size_t size`

    This must be manually set to the size of the complex type.

  `unsigned short alignment`

    This must be manually set to the alignment of the complex type.

  `unsigned short type`

    For a complex type, this must be set to `FFI_TYPE_COMPLEX`.

  `ffi_type **elements`

    This is a ‘`NULL`’-terminated array of pointers to `ffi_type` objects. The first element is set to the `ffi_type` of the complex’s base type. The second element must be set to `NULL`.

The section Complex Type Example shows a way to determine the `size` and `alignment` members in a platform independent way.

For platforms that have no complex support in `libffi` yet, the functions `ffi_prep_cif` and `ffi_prep_args` abort the program if they encounter a complex type.