北大青鸟Java培训:C语言编程技术的优缺点?
C语言的一些好的经验曾经通过阅读POV-Ray源代码学会了如何在C语言中实现面向对象编程。
通过阅读GTK+源代码,了解C语言代码的清晰、干净和可维护性。
通过阅读SIOD和Guile的源代码,我们知道如何用C语言实现Scheme解析器。
用C语言写GNOMEEye的初始版本,优化微文件渲染。
C语言的一些不好的经历我在进化组的时候,很多东西总是死机。
那个时候还没有沃顿庄园。为了获得Purify,你需要购买一台Solaris机器。
调试gnome-vfs线程死锁问题。
调试Mesa,但一无所获。
我接手了Nautilus-share的初始版本,却发现代码中并没有使用free()。
我想重构我的代码,但我不知道如何管理我的内存。
想把代码打包,却发现到处都是全局变量,没有静态函数。
但不管怎样,我们还是来说说在Rust里但在C语言里没有的东西吧。
自动资源管理Rust借鉴了C++的一些思想,如RAII(资源获取初始化)和智能指针,增加了值的单一所有权原则,提供了自动决策的资源管理机制。
自动化:不需要手动调用free()。
内存会在使用后自动释放,文件会在使用后自动关闭,互斥会在作用域外自动释放。
如果你想封装外部资源,基本上你只需要实现Drop trait。
打包的资源就像编程语言的一部分,因为你不需要管理它的生命周期。
决策:创建资源(内存分配、初始化、打开文件等。)然后在范围外销毁。
没有垃圾收集这回事:当代码被执行时,一切都结束了。
程序数据的生命周期看起来像一个函数调用树。
如果我写代码的时候总是忘记调用这些方法(free/close/destroy),或者发现之前写的代码忘记调用了,甚至调用错了,那么我就不想再用这些方法了。
泛型Vec实际上是元素T的向量,而不仅仅是对象指针的数组。
编译后,它只能用于存储t类型的对象。
用C语言实现类似的功能需要很多代码,不想再做了。
Trait不仅仅是一个interfaceRust,它不是那样的面向对象编程语言,它有一个trait,看起来像是计算机中的一个接口——可以用来实现动态绑定。
如果一个对象实现了Drawable,那么就可以确定这个对象有draw()方法。
但无论如何,特质的力量不止于此。
依赖管理之前需要实现依赖管理:手工调用g-config或者通过自动化工具宏调用。
指定头文件和库文件路径。
基本上,人们需要确保安装了正确版本的库文件。
在Rust中,你只需要写一个Cargo.toml文件,然后在文件中指明依赖库的版本。
这些依赖库将被自动下载或从指定的地方获得。
用C语言测试单元测试非常困难,原因如下:内部函数通常是静态的。
换句话说,它们不能被外部文件调用。
测试程序需要用#include指令包含源文件,或者在测试过程中使用#ifdefs删除这些静态函数。
你需要写一个Makefile把测试程序链接到一些依赖库或者一些代码上。
你需要使用测试框架,在上面注册测试用例,并学习如何使用它们。
HygienicMacro)Rust的health宏避免了C语言宏可能出现的问题,比如宏中的某些东西会掩盖代码中的标识符。
Rust不要求宏中的所有符号都使用括号,比如max(5+3,4)。
没有自动转换。在C语言中,辽宁北大青鸟发现很多bug都是无意中把int转换成short或者char造成的,Rust中不会出现这种情况,因为需要显示转换。
不会出现整数溢出,这个就不用解释了。