1. 程式人生 > >C++與Rust引用外部符號的比較

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};
複製程式碼