在C++中,
在为CPU编写仿真器时,我错过了上述内容
在C中bool(布尔)占用了多少空间?它是1位,1字节还是别的什么?程序是32位还是64位是否重要?
一位同事和我一直在讨论如何通过FFI bool从<stdbool.h>(又名_Bool)返回Rust.
我们想要在Rust中使用我们的C99代码:
bool
myfunc(void) {
...
}
Run Code Online (Sandbox Code Playgroud)
我们让Rust了解myfunc使用extern C块:
extern "C" {
fn myfunc() -> T;
}
Run Code Online (Sandbox Code Playgroud)
具体类型应该T是什么?
锈没有c_bool在libc箱子的,如果你在网上搜索,你会发现各种GitHub的问题和RFC中,人们讨论这个问题,但真的不来,什么是正确和便携式任何共识:
据我所知:
这一评论表明,如果一个C99 bool被传递给函数的参数或出功能的返回值,并在bool比C的情况下int则提升到相同大小作为int.在这种情况下,我们可以告诉Rust T是u32.
好吧,但如果(由于某种原因)C99 bool是64位宽怎么办?是否u32还安全吗?也许在这种情况下,我们会截断4个最重要的字节,这很好,因为4个最低有效字节足以表示true和false.
我的推理是否正确?在Rust得到之前libc::c_bool,你将使用什么? …
以下代码可在 amd64 上的 Rust 1.8 上正常运行。
use std::mem;
fn main() {
let f: u8 = unsafe { mem::transmute(false) };
let t: u8 = unsafe { mem::transmute(true) };
assert_eq!(0, f);
assert_eq!(1, t);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以假设这总是有效吗?我试图找到有关代表性的参考资料bool,但我只找到了this和this,但我认为这并不权威。