Rust宏和普通函數的區別

Rust 中的宏(macro)和普通函數有以下核心區別,分別從用途、擴展方式、性能影響語法特征等多個方面來解釋:


📌 1. 定義方式

項目函數
定義方式macro_rules!macro(新版)fn 關鍵字
調用方式類似于函數,但結尾是 !(如 println!()常規函數調用,如 foo()

📌 2. 是否發生在編譯前

  • 宏是在編譯前展開(即代碼生成階段),屬于語法擴展。

  • 函數是在編譯時處理,屬于語義層面的內容。

🔹 也就是說,宏是**"寫代碼的代碼"(元編程)**,它能生成任意的代碼。


📌 3. 接受參數的靈活性

  • 宏可以接受任意數量和類型的參數,比如可以寫一個 vec![1, 2, 3],其中元素的個數不限。

  • 函數參數必須在定義時確定類型和數量,如 fn add(x: i32, y: i32) -> i32


📌 4. 支持控制語句與語法結構

  • 宏可以生成結構體、模塊、甚至實現某個 trait 的代碼。

  • 函數只能做語句級的運算,無法控制代碼結構的生成。

? 舉例:

macro_rules! say_hello {() => {println!("Hello!");};
}fn say_hello_fn() {println!("Hello!");
}
  • say_hello!() 是在編譯前展開為 println!("Hello!");

  • say_hello_fn() 是在運行時執行


📌 5. 性能差異

  • 宏展開后的代碼可以是內聯的,性能可能更高(尤其在頻繁調用時)。

  • 函數調用會有棧幀壓棧和跳轉,但現代優化后開銷極低

但是,不建議濫用宏來替代函數,維護成本高,錯誤難以定位。


📌 6. 調試難度

  • 宏展開后的代碼不容易調試,編譯錯誤也更難理解。

  • 函數調用的錯誤通常更清晰、定位更簡單。


📌 7. 使用場景對比

場景建議用宏建議用函數
想寫 DSL(領域特定語言)? 是? 否
生成重復代碼? 是? 否
普通邏輯封裝? 否? 是
控制編譯結構? 是? 否

? 總結一句話

宏是為了解決不能用函數解決的問題,比如代碼生成和語法擴展,而函數是寫程序邏輯的主力。能用函數就不要用宏,除非你需要編譯期的代碼生成能力。


需要我舉更復雜的例子,比如自己實現一個 my_vec! 宏、或者對比 println!print_fn 嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88901.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Qt C++的影像重采樣批處理工具設計與實現

摘要 本文介紹了一種基于Qt C++框架開發的高效影像重采樣批處理工具。該工具支持按分辨率(DPI) 和按縮放倍率兩種重采樣模式,提供多種插值算法選擇,具備強大的批量處理能力和直觀的用戶界面。工具實現了影像處理的自動化流程,顯著提高了圖像處理效率,特別適用于遙感影像處…

TypeScript 中的 WebSocket 入門

如何開始使用 Typescript 和 React 中的 WebSockets 創建一個簡單的聊天應用程序 示例源碼:ws 下一篇:https://blog.csdn.net/hefeng_aspnet/article/details/148898147 介紹 WebSocket 是一項我目前還沒有在工作中使用過的技術,但我知道…

TMS汽車熱管理系統HILRCP解決方案

TMS汽車熱管理系統介紹 隨著汽車電動化和智能化的發展,整車能量管理內容增多,對汽車能量管理的要求也越來越高,從整車層面出發對各子系統進行能量統籌管理將成為電動汽車未來的發展趨勢,其中汽車熱管理是整車能量管理的重要組成部…

CCleaner Pro v6.29.11342 綠色便攜版

CCleaner Pro v6.29.11342 綠色便攜版 CCleaner是Piriform(梨子公司)最著名廣受好評的系統清理優化及隱私保護軟件,也是該公司主打和首發產品,它體積小、掃描速度快,具有強大的自定義清理規則擴展能力。CCleaner是一款…

不做手機控APP:戒掉手機癮,找回專注與自律

在當今數字化時代,手機已經成為我們生活中不可或缺的一部分。然而,過度依賴手機不僅會分散我們的注意力,影響學習和工作效率,還可能對身心健康造成負面影響。為了幫助用戶擺脫手機依賴,重拾自律和專注,一款…

Go 語言中的接口

1、接口與鴨子類型 在 Go 語言中,接口(interface)是一個核心且至關重要的概念。它為構建靈活、可擴展的軟件提供了堅實的基礎。要深入理解 Go 的接口,我們必須首先了解一個在動態語言中非常普遍的設計哲學——鴨子類型&#xff0…

在項目中如何巧妙使用緩存

緩存 對于經常訪問的數據,每次都從數據庫(硬盤)中獲取是比較慢,可以利用性能更高的存儲來提高系統響應速度,俗稱緩存 。合理使用緩存可以顯著降低數據庫的壓力、提高系統性能。 那么,什么樣的數據適合緩存…

SLAM中的非線性優化-2D圖優化之零空間(十五)

這節在進行講解SLAM中一個重要概念,零空間,講它有啥用呢?因為SLAM中零空間的存在,才需要FEJ或固定約束存在,本節內容不屬于2D圖優化獨有,先看看什么是零空間概念;零空間是一個核心概念&#xff…

如何解決本地DNS解析失敗問題?以連接AWS ElastiCache Redis為例

在云服務開發中,DNS解析問題常常成為困擾開發者的隱形障礙。本文將通過AWS ElastiCache Redis連接失敗的實際案例,詳細介紹如何診斷和解決DNS解析問題,幫助你快速恢復服務連接。 引言 在使用 telnet 或 redis-cli 連接 AWS ElastiCache Redis 時,有時會遇到類似以下錯誤:…

探索釘釘生態中的宜搭:創建與分享應用的新視界

在當今快速發展的數字化時代,企業對于高效協作和信息管理的需求日益增長。作為阿里巴巴集團旗下的智能工作平臺,釘釘不僅為企業提供了強大的溝通工具,其開放的生態系統也為用戶帶來了無限可能。其中,宜搭(YiDa&#xf…

深入理解事務和MVCC

文章目錄 事務定義并發事務代碼實現 MVCC定義核心機制 事務 定義 什么是事務? 事務是指一組操作要么全部成功,要么全部失敗的執行單位。 在數據庫中,一個事務通常包含一組SQL語句,系統保證這些語句作為一個整體執行。 為什么引…

用 Python 繪制精美雷達圖:多維度材料屬性對比可視化全指南

🌟 為什么選擇雷達圖?從材料科學到多維數據對比的可視化利器 在科研和數據分析領域,當我們需要同時展示多個維度的數據對比時,傳統的柱狀圖或折線圖往往顯得力不從心。這時候,雷達圖(Radar Chart&#xff…

Excel學習03

超級表與圖表 Excel中具有超級表的功能。所謂超級表(官方名稱為“表格”,快捷鍵CtrlT)是Excel中一個強大的數據管理工具,它將普通的數據區域轉換為具有只能功能的交互式表格。 這就是表格變為超級表的樣子。超級表默認具備凍結窗…

Netflix 網飛的架構演進過程、Java在網飛中的應用|圖解

寫在前面 上一篇文章中,我們講解了網飛當前的架構,但網飛的架構并不是一開始就是這樣的,而是不斷演進發展才是當前的樣子。 這篇文章我們就來講講網飛架構的演進過程。 第一階段:Zuul Gateway REST API 使用 Zuul 作為API網關…

使用ros2服務實現人臉檢測2-人臉檢測功能實現(適合0基礎小白)

文章目錄 一、用到的庫二、使用步驟1.引入庫2.獲取圖片真實路徑3.檢測人臉4.繪制人臉5.顯示結果6.更改setup.py7.完整代碼 三、結果展示 一、用到的庫 face_recognition:實現在圖片中檢測人臉。 cv2:顯示圖片,并且可以在圖像中展示檢測結果。…

中國農村統計年鑒-Excel版(1985-2024年)

《中國農村統計年鑒》系統收錄了全國和各省農村社會經濟統計數據,以及近年全國農村主要統計數據,是一部全面反映我國農村社會經濟情況的資料性年刊。年鑒內容覆蓋農村人口結構、農業產值、主要農產品產量、市場物價、進出口貿易以及收入消費水平等社會經…

golang pprof性能調試工具

簡介 pprof是性能調試工具,可以生成類似火焰圖、堆棧圖,內存分析圖等。 整個分析的過程分為兩步:1. 導出數據,2. 分析數據。

PPIO × 302.AI:三分鐘搭建可共享的聊天機器人

最近,各主流模型廠商頻頻發布新模型,有一如既往強大的DeepSeek-R1-0528,擅長長輸入推理的MiniMax-M1-80k…… 好用的AI大模型這么多,如何才能集成在一個應用自由使用呢?302.AI作為企業級AI應用平臺支持各主流模型調用&…

怎么樣在自己的網站/獨立站中添加視頻?

文章目錄 **前言** 一、視頻在網站/獨立站的好處二、視頻嵌入網站的原理三、如何簡易地把視頻嵌入到獨立站中? 前言 在信息傳播形式日益多元化的當下,靜態文字與圖片早已無法滿足用戶對沉浸式瀏覽體驗的需求。視頻以其動態畫面、聲音及文字相結合的特性…

【圖像處理基石】什么是攝影的數碼味?

“數碼味”是一個攝影術語,通常指照片看起來不自然,有過度處理的痕跡,比如色彩過于鮮艷、對比度偏高、高光過曝、陰影死黑,或者有明顯的銳化痕跡和噪點。這種現象在手機攝影中尤為常見,因為手機相機的自動算法往往會為…