C++與Rust引用外部符號的比較

文檔列表見:Rust 移動端跨平臺複雜圖形渲染項目開發系列總結(目錄)git

一般,C/C++經過#include導入外部符號(不考慮extern和前置聲明的狀況)。Rust沒頭文件,由use導入外部符號,相似Java的import,可是Rust不用Java包名那種倒URL作法,而是採用了相似C++命名空間的方案,經過mod聲明模塊用以區分來自不一樣模塊或文件的符號。示例以下:github

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

use namespace my_package_1::ClassHello;
use namespace my_package_2::ClassWorld;
複製代碼

Rust經過as關鍵字解決多個模塊中符號重名問題。數據結構

use OpenGLES::ES2::gl::*;
use Framebuffer::*;

use mod_1::MyStruct as Mod1MyStruct;
use mod_2::MyStruct as Mod2MyStruct;
複製代碼

當C++包含兩個同名文件時,須要帶上路徑進行區分。多個命名空間中存在同名類時,每次使用都得用完整符號名進行區分,即Namespace1::Namespace2::NamespaceN::MyClass,代碼比較頻繁。 Rust在處理這一問題有更好的解決方案:as重命名避免衝突。可是,經過我實踐發現,使用完整模塊路徑及類型名更直觀,相似C++的作法。app

使用*導入全部符號雖然方便,可是會消耗更多編譯時間,所以枚舉當前文件使用的符號是更好的實踐。post

進階:self關鍵字可導入mod.rs文件或者與上層目錄同名的rs文件。 示例以下:spa

// 此處self表示rc.rs,由於rc模塊內部沒切成多個目錄組織源碼
use std::rc::{self, Rc, Weak}; 
// 此處self表示rc目錄下的mod.rs文件
use std::io::{self, Read, Write};
複製代碼

導入多個二級模塊及某一模塊數據結構的示例:code

use hal::{
    buffer, format as f, window::Extent2D,
};
複製代碼

導入多級模塊及模塊內數據結構的示例:orm

// https://github.com/amethyst/amethyst/blob/v0.9.0/examples/fly_camera/main.rs
use amethyst::{
    assets::{PrefabLoader, PrefabLoaderSystem, RonFormat},
    controls::FlyControlBundle,
    core::transform::TransformBundle,
    input::InputBundle,
    prelude::*,
    renderer::{DrawShaded, PosNormTex},
    utils::{application_root_dir, scene::BasicScenePrefab},
    Error,
};
複製代碼
相關文章
相關標籤/搜索