我试图访问FILE
libc
结构的不同字段。
FILE
stdio.h
在libc中使用#[repr(C)]
pub struct FILE {
pub _p: libc::c_char,
pub _r: libc::c_int,
pub _w: libc::c_int,
pub _flags: libc::c_short,
pub _file: libc::c_short,
...
}
时,它们来自FILE
变体,这在某种程度上是访问字段的方式。以下代码触发mut *
_ flags error: attempted access of field
。
on type '*mut FILE', but no field with that name was found
let stdout = libc::fdopen(libc::STDOUT_FILENO, &('w' as libc::c_char));
let is_unbuffered = (fp._flags & libc::_IONBF as i16) != 0
类型的变量没有FILE
变体,但我需要使用mut *
。
答案 0 :(得分:3)
FILE
被定义为opaque type,即:
pub enum FILE {}
因此没有要访问的字段(甚至取消引用原始指针)。
我认为直接访问FILE
结构的字段并不是一个好主意,即使在C中也是如此。您应该尝试在stdio.h
上找到一个能够达到您想要的功能。
无论如何,一种解决方法是创建自己的FILE
定义并从&mut
获取fp
:
#[repr(C)]
pub struct MY_FILE {
pub _p: libc::c_char,
pub _r: libc::c_int,
pub _w: libc::c_int,
pub _flags: libc::c_short,
pub _file: libc::c_short,
// ...
}
// ...
unsafe {
let fp = libc::fdopen(libc::STDOUT_FILENO, &('w' as libc::c_char));
let fp = &mut *(fp as *mut MY_FILE);
let is_unbuffered = (fp._flags & libc::_IONBF as i16) != 0;
}
请注意,如果您没有使用MY_FILE
的正确定义,您将获得一些垃圾数据甚至是段错误。
答案 1 :(得分:0)
指针本身没有属性,它指向的结构。
这意味着您需要访问*fp._flags
,而不是fp._flags
(假设fp
的类型为*mut FILE
)。
此外,您可能需要将访问权限包装在unsafe
块中,因为取消引用原始指针始终是不安全的操作。尝试这样的事情:
let flags = unsafe { (*fp)._flags };
let is_unbuffered = (flags & libc::_IONBF as i16) != 0;