구조체의 다른 필드에 액세스하려고 시도했습니다. libc
입니다. stdio.h
의 메모리 매핑에 따라 녹에* mut libc :: FILE 필드에 어떻게 액세스합니까?
FILE
구현 : libc의 FILE
의 작업을 할 때
#[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,
...
}
그들은 mut *
변형에 와서,이 어떻게 든 필드에 액세스하는 방법입니다. 다음 코드는 error: attempted access of field
_flags 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
mut *
변형 행함이없는 유형 FILE
의 변수하지만 난 mut *
작업을 얻을 필요가있다.
감사합니다. '& mut *'비트가 내 코드에서 빠진 부분이었습니다. 이것이하는 일에 대해 어떤 생각을 밝힐 수 있습니까? 나는 어둠 속에서 포인터와 참조에 관해서는 정말 어려운 Java/PHP/Python 세계에서 오는 것입니다 – hansaplast
추가 질문 : 내 구조체 이제 "작동하지 않습니다":'_flags' 항상 0입니다. 그걸 고치는 방법에 대한 어떤 힌트? 여기에 OSX에서 stdio.h가 있습니다 : https://gist.github.com/philippkeller/3921705e7b5d0ef5d394501496d146fe 난 그냥 문제가 무엇인지 모르겠다. IMO는 _flags에 직접 액세스하고'_flags'를 사용하여 정확해야합니다. 다음의 것들은 잘못 될 수있다. (심지어는 제외된다) – hansaplast
'fdopen'은 [원시 포인터] (https://doc.rust-lang.org/stable/std/primitive.pointer.html)를 반환한다. 원시 포인터로는 많은 일을 할 수 없기 때문에 mutable reference ('& mut')를 얻습니다. ('*'포인터를 역 참조하고,'FILE' 타입의 값을주고,'mut ' FILE' 값).나는'FILE' 구조의 필드에 직접 접근하는 것이 좋지 않다고 생각합니다. 어쩌면 파일을 버퍼링했는지 테스트 할 때 원하는 것을 설명하는 또 다른 질문을해야 할 것입니다. – malbarbo