This page contains a canonical list of type symbols recognized by attach_function and Struct#layout
Types
The following types can be used as arguments and return types:
| Symbol | Description | Expected/returned type from FFI | Notes | 
|---|---|---|---|
| :char | 8-bit character | Integer | |
| :uchar | 8-bit unsigned character | Integer | |
| :int8 | 8-bit signed integer | Integer | |
| :uint8 | 8-bit unsigned integer | Integer | |
| :short | 16-bit signed integer | Integer | |
| :ushort | 16-bit unsigned integer | Integer | |
| :int16 | 16-bit signed integer | Integer | |
| :uint16 | 16-bit unsigned integer | Integer | |
| :int | signed integer | Integer | platform specific size | 
| :uint | unsigned integer | Integer | platform specific size | 
| :int32 | 32-bit signed integer | Integer | |
| :uint32 | 32-bit unsigned integer | Integer | |
| :long | long int | Integer | platform-specific size | 
| :ulong | unsigned long int | Integer | platform-specific size | 
| :int64 | 64-bit signed integer | Integer | |
| :uint64 | 64-bit unsigned integer | Integer | |
| :long_long | 64-bit signed integer | Integer | |
| :ulong_long | 64-bit unsigned integer | Integer | |
| :float | 32-bit floating point | Float | |
| :double | 64-bit floating point (double-precision) | Float | |
| :pointer | pointer with platform-specific size | out: FFI::Pointer in: FFI::Pointer, String, Integer | Data may contain zero bytes and may not be zero-terminated. Strings can be passed directly to C, but should be considered read only on both Ruby and C side. | 
| :string | C-style (NULL-terminated) character string. | String | :stringshould be considered to beconst char *and the Ruby string must not be changed as long as it’s accessed by the library. If the string buffer shall be modified from C or Ruby side, use:pointerand FFI::MemoryPointer instead. | 
| :bool | boolean | true/false | |
| [[Enums]] | your own custom enum group (or its symbol) as a type | Symbol/Integer | 
For function return type only:
| Symbol | Description | Returned type from FFI | Notes | 
|---|---|---|---|
| :void | return type void | Pointer | for functions that return nothing | 
| :strptr | Ruby String and a Pointer to C memory | Array (e.g. ["foo", ptr]) | useful to free the memory from within Ruby | 
For function argument type only:
| Symbol | Description | Expected by FFI | Notes | 
|---|---|---|---|
| :buffer_in | Similar to :pointer, but optimized for Buffers that the function can only read (not write). | FFI::Pointer | |
| :buffer_out | Similar to :pointer, but optimized for Buffers that the function can only write (not read). | FFI::Pointer | |
| :buffer_inout | Similar to :pointer, but may be optimized for Buffers. | FFI::Pointer | |
| :varargs | variadic arguments | anything | see [[examples]] | 
See also [[Core-Concepts]] for details about the memory management of :pointer, :string and :buffer types.
More Types
Most common C types like :size_t , :uint32_t and :in_addr_t are predefined. For a full list see lib/ffi/platform/<your platform>/types.conf in the git repository.
Furthermore it’s possible to define your own types. This is particular useful to distinguish between different :pointer types like so:
```ruby
  typedef :pointer, :libusb_device_handle
  attach_function ‘libusb_reset_device’, [:libusb_device_handle], :int  
There are even more nice possibilities to map values:
- Mapping of structs with optional type safety
- Definition of your own data converters
See this blog post for more information.