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

Mic*_*ail 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);
}
Run Code Online (Sandbox Code Playgroud)

"Project1"库看起来像这样:

#include <stdio.h>

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

预期产量:

from C++: 2
from Rust: 2
Run Code Online (Sandbox Code Playgroud)

实际输出顺序相反:

from Rust: 2
from C++: 2
Run Code Online (Sandbox Code Playgroud)

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

细节:

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

Mic*_*ail 5

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

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

感谢@Veedrac的回答

  • 刷新行为通常随`isatty(fileno(stdout))`而变化.因此,相同的操作系统,相同的代码,相同的编译器,**相同的二进制**,可以具有不同的缓冲行为,具体取决于如何调用二进制文件. (4认同)