mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
3851c60cf8
the types are exported from `core::ffi` itself
88 lines
2.9 KiB
Rust
88 lines
2.9 KiB
Rust
//! Platform-specific types, as defined by C.
|
|
//!
|
|
//! Code that interacts via FFI will almost certainly be using the
|
|
//! base types provided by C, which aren't nearly as nicely defined
|
|
//! as Rust's primitive types. This module provides types which will
|
|
//! match those defined by C, so that code that interacts with C will
|
|
//! refer to the correct types.
|
|
|
|
#![stable(feature = "core_ffi", since = "1.30.0")]
|
|
#![allow(non_camel_case_types)]
|
|
|
|
#[doc(inline)]
|
|
#[stable(feature = "core_c_str", since = "1.64.0")]
|
|
pub use self::c_str::CStr;
|
|
#[doc(inline)]
|
|
#[stable(feature = "cstr_from_bytes_until_nul", since = "1.69.0")]
|
|
pub use self::c_str::FromBytesUntilNulError;
|
|
#[doc(inline)]
|
|
#[stable(feature = "core_c_str", since = "1.64.0")]
|
|
pub use self::c_str::FromBytesWithNulError;
|
|
use crate::fmt;
|
|
|
|
#[stable(feature = "c_str_module", since = "1.88.0")]
|
|
pub mod c_str;
|
|
|
|
mod va_list;
|
|
#[unstable(
|
|
feature = "c_variadic",
|
|
issue = "44930",
|
|
reason = "the `c_variadic` feature has not been properly tested on all supported platforms"
|
|
)]
|
|
pub use self::va_list::{VaArgSafe, VaList};
|
|
|
|
mod primitives;
|
|
#[stable(feature = "core_ffi_c", since = "1.64.0")]
|
|
pub use self::primitives::{
|
|
c_char, c_double, c_float, c_int, c_long, c_longlong, c_schar, c_short, c_uchar, c_uint,
|
|
c_ulong, c_ulonglong, c_ushort,
|
|
};
|
|
#[unstable(feature = "c_size_t", issue = "88345")]
|
|
pub use self::primitives::{c_ptrdiff_t, c_size_t, c_ssize_t};
|
|
|
|
// N.B., for LLVM to recognize the void pointer type and by extension
|
|
// functions like malloc(), we need to have it represented as i8* in
|
|
// LLVM bitcode. The enum used here ensures this and prevents misuse
|
|
// of the "raw" type by only having private variants. We need two
|
|
// variants, because the compiler complains about the repr attribute
|
|
// otherwise and we need at least one variant as otherwise the enum
|
|
// would be uninhabited and at least dereferencing such pointers would
|
|
// be UB.
|
|
#[doc = include_str!("c_void.md")]
|
|
#[lang = "c_void"]
|
|
#[repr(u8)]
|
|
#[stable(feature = "core_c_void", since = "1.30.0")]
|
|
pub enum c_void {
|
|
#[unstable(
|
|
feature = "c_void_variant",
|
|
reason = "temporary implementation detail",
|
|
issue = "none"
|
|
)]
|
|
#[doc(hidden)]
|
|
__variant1,
|
|
#[unstable(
|
|
feature = "c_void_variant",
|
|
reason = "temporary implementation detail",
|
|
issue = "none"
|
|
)]
|
|
#[doc(hidden)]
|
|
__variant2,
|
|
}
|
|
|
|
#[stable(feature = "std_debug", since = "1.16.0")]
|
|
impl fmt::Debug for c_void {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.debug_struct("c_void").finish()
|
|
}
|
|
}
|
|
|
|
// Link the MSVC default lib
|
|
#[cfg(all(windows, target_env = "msvc"))]
|
|
#[link(
|
|
name = "/defaultlib:msvcrt",
|
|
modifiers = "+verbatim",
|
|
cfg(not(target_feature = "crt-static"))
|
|
)]
|
|
#[link(name = "/defaultlib:libcmt", modifiers = "+verbatim", cfg(target_feature = "crt-static"))]
|
|
unsafe extern "C" {}
|