为什么Rust函数和FFI C ++函数以相反的顺序执行?

时间:2018-03-25 11:13:10

标签: c++ rust

我尝试将外部C ++函数与Rust应用程序链接。此函数有效,但它的执行顺序与从Rust代码调用的顺序不同。

为什么会这样?这有记录吗?

以下是Rust应用程序的列表:

extern crate libc;
use libc::c_int;

#[link(name = "Project1", kind = "static")]
extern "C" {
    pub fn lib_fun(i: c_int) -> c_int;
}

fn main() {
    unsafe {
        lib_fun(2);
    }
    println!("from Rust: {}", 2);
}

“Project1”库看起来像这样:

#include <stdio.h>

extern "C" {
    int lib_fun(int t) {
        printf("from C++: %d\n", t);
        return t;
    }
}

预期产出:

from C++: 2
from Rust: 2

实际输出顺序相反:

from Rust: 2
from C++: 2

外部函数lib_func是否在另一个线程中执行?为什么呢?

详细说明:

  • 平台:Windows 7,x64,
  • Rust:1.26.0(每晚),
  • C ++:Microsoft Visual Studio社区2017预览版15.7.0预览版2.0
  • 终端:IntelliJ IDEA的集成终端。

1 个答案:

答案 0 :(得分:5)

外部C ++代码使用自己的缓冲区写入stdout,并且它会比Rust调用者更快地刷新到系统缓冲区。 printf("...\n")没有像我预期的那样刷新stdout缓冲区。

相反,我需要手动刷新它,例如通过调用fflush(stdout);

Thanks for this answer to @Veedrac