mirror of https://github.com/rust-lang/book
Don’t recommend empty enums for opaque types
Same as https://github.com/rust-lang-nursery/nomicon/pull/44
This commit is contained in:
parent
131859023a
commit
a3d7bc224a
|
@ -737,11 +737,11 @@ void foo(struct Foo *arg);
|
||||||
void bar(struct Bar *arg);
|
void bar(struct Bar *arg);
|
||||||
```
|
```
|
||||||
|
|
||||||
To do this in Rust, let’s create our own opaque types with `enum`:
|
To do this in Rust, let’s create our own opaque types:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
pub enum Foo {}
|
#[repr(C)] pub struct Foo { private: [u8; 0] }
|
||||||
pub enum Bar {}
|
#[repr(C)] pub struct Bar { private: [u8; 0] }
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn foo(arg: *mut Foo);
|
pub fn foo(arg: *mut Foo);
|
||||||
|
@ -750,7 +750,9 @@ extern "C" {
|
||||||
# fn main() {}
|
# fn main() {}
|
||||||
```
|
```
|
||||||
|
|
||||||
By using an `enum` with no variants, we create an opaque type that we can’t
|
By including a private field and no constructor,
|
||||||
instantiate, as it has no variants. But because our `Foo` and `Bar` types are
|
we create an opaque type that we can’t instantiate outside of this module.
|
||||||
|
An empty array is both zero-size and compatible with `#[repr(C)]`.
|
||||||
|
But because our `Foo` and `Bar` types are
|
||||||
different, we’ll get type safety between the two of them, so we cannot
|
different, we’ll get type safety between the two of them, so we cannot
|
||||||
accidentally pass a pointer to `Foo` to `bar()`.
|
accidentally pass a pointer to `Foo` to `bar()`.
|
||||||
|
|
Loading…
Reference in New Issue