共有列挙型
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[cxx::bridge]
mod ffi {
enum Suit {
Clubs,
Diamonds,
Hearts,
Spades,
}
}
生成された Rust:
#![allow(unused)] fn main() { // Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 #[derive(Copy, Clone, PartialEq, Eq)] #[repr(transparent)] pub struct Suit { pub repr: u8, } #[allow(non_upper_case_globals)] impl Suit { pub const Clubs: Self = Suit { repr: 0 }; pub const Diamonds: Self = Suit { repr: 1 }; pub const Hearts: Self = Suit { repr: 2 }; pub const Spades: Self = Suit { repr: 3 }; } }
生成された C++:
enum class Suit : uint8_t {
Clubs = 0,
Diamonds = 1,
Hearts = 2,
Spades = 3,
};
- Rust 側では、共有列挙型用に生成されるコードは、実際には数値をラップする struct です。これは、C++ では enum class が列挙されているどのバリアントとも異なる値を保持していても UB にはならず、Rust 側の表現も同じ振る舞いを持つ必要があるためです。