Attribute Macro safer_ffi::ffi_export
source · [−]#[ffi_export]
Expand description
Export a function to be callable by C.
Example
use ::safer_ffi::prelude::ffi_export;
#[ffi_export]
/// Add two integers together.
fn add (x: i32, y: i32) -> i32
{
x + y
}
-
ensures that the generated headers will include the following definition:
#include <stdint.h> /* \brief * Add two integers together. */ int32_t add (int32_t x, int32_t y);
-
exports an
add
symbol pointing to the C-ABI compatibleint32_t (*)(int32_t x, int32_t y)
function.(The crate type needs to be
cdylib
orstaticlib
for this to work, and, of course, the C compiler invocation needs to include-L path/to/the/compiled/library -l name_of_your_crate
)- when in doubt, use
staticlib
.
- when in doubt, use
ReprC
You can use any Rust types in the singature of an #[ffi_export]
-
function, provided each of the types involved in the signature is ReprC
.
Otherwise the layout of the involved types in the C world is undefined,
which #[ffi_export]
will detect, leading to a compilation error.
To have custom structs implement ReprC
, it suffices to annotate the
struct
definitions with the #[derive_ReprC]
(on top of the obviously required #[repr(C)]
).