3
宏可以做什麼,編譯器插件不能,反之亦然? 「不能」,我的意思是不可能達到相同的目的,並不是說它可以以不同的方式實現。宏和編譯器插件有什麼區別?
例如,一個宏可以impl
一些結構特徵,編譯器插件可以derive
結構的一些特徵。它們都可以自動impl
一個結構的特徵。
宏可以做什麼,編譯器插件不能,反之亦然? 「不能」,我的意思是不可能達到相同的目的,並不是說它可以以不同的方式實現。宏和編譯器插件有什麼區別?
例如,一個宏可以impl
一些結構特徵,編譯器插件可以derive
結構的一些特徵。它們都可以自動impl
一個結構的特徵。
編譯插件宏可以做任何事情macro_rules!
宏可以做,再加上更多。編譯器插件可以註冊派生宏,合成新標識符,解析AST節點,解析字符串,執行文件IO,等。,等列出所有內容都是毫無意義的,因爲它可以重現內部編譯器API,定期進行。
關於唯一的主要限制是它們只能訪問它們被調用的內容,或者可以從它們被調用的內容(除了一些額外的,已經存在的上下文信息)獲得它們:它們不能訪問或與任何尚不存在的東西一起工作。像類型,或者什麼名字的意思,或者表達式有什麼價值。
好吧,好的,有一事情編譯插件不能這樣做宏可以:跨不同版本的編譯器穩定工作。 (還有)
只有編譯器擴展才可能擴展現有語法,而不使用宏調用。例如。創造新的「派生」特徵。 –