如何声明一个函数而不实现它?

hel*_*low 3 rust

我想比较函数的不同实现的程序集,但我不想实现某些功能,只需声明它们。

在 Rust 中,前向声明通常是不必要的,因为编译器不需要函数来解析它们(与 C 中不同)。但是,是否有可能做一些等同于前向声明的事情?

Seb*_*edl 5

无法前向声明函数。Rust 中的任何给定实体都只有一个声明。

但是,您可以使用unimplemented!()todo!()宏来快速填充由于某种原因您还不想实现的函数体。两者基本上都是panic!()特定错误消息的别名。


rod*_*igo 5

如果您将函数声明为 as#[inline(never)]您将获得函数调用指令以防止进一步优化。

主要限制是优化后你的函数不能为空,所以它必须有一些副作用(感谢@hellow 建议使用compiler_fence而不是println!)。

例如,这段代码(Godbolt):

pub fn test_loop(num: i32) {
    for _i in 0..num {
        dummy();
    }
}

#[inline(never)]
pub extern fn dummy() {
    use std::sync::atomic::*;
    compiler_fence(Ordering::Release);
}
Run Code Online (Sandbox Code Playgroud)

将产生以下程序集(带有-O),我认为您需要:

pub fn test_loop(num: i32) {
    for _i in 0..num {
        dummy();
    }
}

#[inline(never)]
pub extern fn dummy() {
    use std::sync::atomic::*;
    compiler_fence(Ordering::Release);
}
Run Code Online (Sandbox Code Playgroud)

加上它的代码dummy()实际上是空的:

example::dummy:
        ret
Run Code Online (Sandbox Code Playgroud)