我正在用C编写一段预写的代码到Rust.所以这里有一个条件,在c中是由long jmp处理的,但我不知道如何在ruust中处理它.
if (pointer_to_struct->count_of_something < (count << 10)){
longjmp(*(pointer_to_struct->xyz), MACRO);
}
我正在用C编写一段预写的代码到Rust.所以这里有一个条件,在c中是由long jmp处理的,但我不知道如何在ruust中处理它.
if (pointer_to_struct->count_of_something < (count << 10)){
longjmp(*(pointer_to_struct->xyz), MACRO);
}
你在你的问题中几乎没有给出背景,但我还是会试着回答.
在C中,当其他方法不可行时,使用longjmp()
来展开深度嵌套的调用堆栈.它很难正确使用,但考虑到在C中缺乏其他展开堆栈的方法,它有时是最小的害处.
在Rust中,最惯用的展开堆栈的方法是使调用堆栈中涉及的所有函数返回Result<...>
,对所有调用使用问号操作符?
,当您想要展开时返回Err(...)
.这会导致所有函数正常返回,并调用析构函数.
最接近set_jmp()
和long_jmp()
的Rust 是catch_unwind()
和panic!()
.这些功能不能用作一般的流量控制机制.您只能捕捉到"解压panic ",这有时是不可用的(例如,在嵌入式环境中).如果可以避免,请不要使用catch_unwind()
,而应使用适当的错误处理.