C++与Rust引用外部符号的比较

文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)

通常,C/C++通过#include导入外部符号(不考虑extern和前置声明的情况)。Rust没头文件,由use导入外部符号,类似Java的import,但是Rust不用Java包名那种倒URL做法,而是采用了类似C++命名空间的方案,通过mod声明模块来区别来自不同模块或文件的符号。示例如下:

#include "OpenGLES/ES2/gl.h"
#include "Framebuffer.h"

use namespace my_package_1::ClassHello;
use namespace my_package_2::ClassWorld;
复制代码
use OpenGLES::ES2::gl::*;
use Framebuffer::*;
// Rust通过as关键字解决多个模块中类型重名问题
use mod_1::MyStruct as Mod1MyStruct;
use mod_2::MyStruct as Mod2MyStruct;
复制代码

当C++包含两个同名文件时,需要带上路径进行区分。多个命名空间中存在同名类时,每次使用都得用完整符号名进行区分,即Namespace1::Namespace2::NamespaceN::MyClass,代码比较频繁。 Rust在处理这一问题有更好的解决方案:as重命名避免冲突。

使用*导入所有符号虽然方便,但是会消耗更多编译时间,因此枚举当前文件使用的符号是更好的实践。

进阶:self关键字可导入mod.rs文件或者与上一次目录同名的rs文件。 示例如下:

// 此处self表示rc.rs,因为rc模块内部没切成多个目录组织源码
use std::rc::{self, Rc, Weak}; 
// 此处self表示rc目录下的mod.rs文件
use std::io::{self, Read, Write};
复制代码

猜你喜欢

转载自juejin.im/post/5beae9dae51d4550c35c7270