写点什么

Rust 遇上 C/C++(二):函数传参

用户头像
Coding Fatty
关注
发布于: 2020 年 05 月 28 日
Rust 遇上 C/C++(二):函数传参

上一期在 Rust 遇上 C/C++(一):数组操作 中,我们了解了 Rust 相比于 C/C++ 在数组操作上提供的安全保证。我相信大家对 Rust 有了初步印象的同时,对这门新生的系统级编程语言产生了浓厚的兴趣。


这一期我们来探讨 Rust 在函数传参上与 C/C++ 的不同,这一期仅讨论基本数据类型

环境:Cent OS 8(Kernel 4.18.0),gcc 8.3.1,g++ 8.3.1,rustc 1.43.1。

C

在 C 中进行函数参数传递时,我们尝试将一个 double 类型(8 字节浮点型)传递给 int 类型(4 字节整型)。众所周知,浮点型和整型在内存的存储形式截然不同,并且大空间到小空间的拷贝,可能引发数据截断,这对程序来说是非常不友好的行为。

不同环境中,double 和 int 的空间大小可能不同。


#include <stdio.h>
void another_function(int x);
int main() { double x = 5.21;
another_function(x);
return 0;}
void another_function(int x) { printf("The value of x is: %d\n", x);}
复制代码


$ gcc main.c$ ./a.outThe value of x is: 5
复制代码


编译没有任何错误,程序正常运行。

具体 5.21 是如何截断成 5 的底层实现细节,在这里就不加赘述了。

C++

在 C++ 中使用和 C 中相同的用例, double 类型(8 字节浮点型)传递给 int 类型(4 字节整型)。


#include <iostream>
using namespace std;
void another_function(int x);
int main() { double x = 5.21;
another_function(x);
return 0;}
void another_function(int x) { cout << "The value of x is: " << x << endl;}
复制代码


$ g++ main.cc$ ./a.outThe value of x is: 5
复制代码


由结果可以看出,C++ “传承”C 灵活的特性,赋予了使用者极高的自由度,反正写好的程序可以被计算机执行即可(当然,这是一句玩笑话)。

Rust

在 Rust 中我们稍微改变一下测试用例,将 i32 类型(4 字节整型)传递给 i64 类型(8 字节整型)。这种传递方式相比于针对 C/C++ 的用例来说,应该算是“友好”许多了吧,让我们来看看在这种“友好”的前提下,Rust 呈现给我们的是什么呢?


fn main() {    let x: i32 = 5;
another_function(x);}
fn another_function(x: i64) { println!("The value of x is: {}", x);}
复制代码


$ rustc main.rserror[E0308]: mismatched types --> main.rs:4:22  |4 |     another_function(x);  |                      ^  |                      |  |                      expected `i64`, found `i32`  |                      help: you can convert an `i32` to `i64`: `x.into()`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
复制代码


是的,在这种较为“友好”的情况下,Rust 在编译过程中就报了错误信息。现在,大家是否也感觉到了作为系统级编程语言,Rust 那是相当严格啊!

总结

在 C/C++ 中进行基本类型数据的函数传参时,对类型检查的能力稍弱。


相同情况下,Rust 在编译过程中就进行严格的类型检查,避免了数据截断等不易察觉的错误。

发布于: 2020 年 05 月 28 日阅读数: 121
用户头像

Coding Fatty

关注

怀揣技术信仰,不忘初心前行。 2018.11.12 加入

即将步入工作的应届毕业生 协议栈开发工程师 喜爱C/C++,Rust,Linux Kernel

评论 (1 条评论)

发布
用户头像
看完大神的内容受益匪浅,期待下次更新🥳🥳🥳
2020 年 05 月 28 日 21:22
回复
没有更多了
Rust 遇上 C/C++(二):函数传参