外部语言函数接口

Rust 提供了到 C 语言库的外部语言函数接口(Foreign Function Interface,FFI)。外 部语言函数必须在一个 extern 代码块中声明,且该代码块要带有一个包含库名称 的 #[link] 属性。

  1. use std::fmt;
  2. // 这个 extern 代码块链接到 libm 库
  3. #[link(name = "m")]
  4. extern {
  5. // 这个外部函数用于计算单精度复数的平方根
  6. fn csqrtf(z: Complex) -> Complex;
  7. // 这个用来计算单精度复数的复变余弦
  8. fn ccosf(z: Complex) -> Complex;
  9. }
  10. // 由于调用其他语言的函数被认为是不安全的,我们通常会给它们写一层安全的封装
  11. fn cos(z: Complex) -> Complex {
  12. unsafe { ccosf(z) }
  13. }
  14. fn main() {
  15. // z = -1 + 0i
  16. let z = Complex { re: -1., im: 0. };
  17. // 调用外部语言函数是不安全操作
  18. let z_sqrt = unsafe { csqrtf(z) };
  19. println!("the square root of {:?} is {:?}", z, z_sqrt);
  20. // 调用不安全操作的安全的 API 封装
  21. println!("cos({:?}) = {:?}", z, cos(z));
  22. }
  23. // 单精度复数的最简实现
  24. #[repr(C)]
  25. #[derive(Clone, Copy)]
  26. struct Complex {
  27. re: f32,
  28. im: f32,
  29. }
  30. impl fmt::Debug for Complex {
  31. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  32. if self.im < 0. {
  33. write!(f, "{}-{}i", self.re, -self.im)
  34. } else {
  35. write!(f, "{}+{}i", self.re, self.im)
  36. }
  37. }
  38. }