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

标签 c++ rust

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

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

这是 Rust 应用程序的 list :

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);
}

“项目 1”库如下所示:

#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 Community 2017 预览版 15.7.0 预览版 2.0
  • 终端:IntelliJ IDEA 的集成终端。

最佳答案

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

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

Thanks for this answer to @Veedrac

关于c++ - 为什么 Rust 函数和 FFI C++ 函数以相反的顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49475166/

相关文章:

scope - 特征中的项目只能在特征已实现且在范围内时使用

rust - 使用 Trait 作为 Vec 类型

rust - 如何使用自定义 libstd 进行构建?

C++ Cycling 包括(三个类,两个虚拟)

c++ - 获取 Windows 时区信息 (C++/MFC)

c++ - 在没有事件异常线程的情况下终止调用 C++

c++ - C.VIM 不工作

c++ - STL 排序是使用交换还是二进制复制?

即使文件存在,Rust 也找不到模块

multithreading - 如何将对堆栈变量的引用传递给线程?