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 | :string should be considered to be const 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 :pointer and 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.