2016-09-17 136 views
3

宏可以做什麼,編譯器插件不能,反之亦然? 「不能」,我的意思是不可能達到相同的目的,並不是說它可以以不同的方式實現。宏和編譯器插件有什麼區別?

例如,一個宏可以impl一些結構特徵,編譯器插件可以derive結構的一些特徵。它們都可以自動impl一個結構的特徵。

+0

只有編譯器擴展才可能擴展現有語法,而不使用宏調用。例如。創造新的「派生」特徵。 –

回答

2

編譯插件宏可以做任何事情macro_rules!宏可以做,再加上更多。編譯器插件可以註冊派生宏,合成新標識符,解析AST節點,解析字符串,執行文件IO,等。,列出所有內容都是毫無意義的,因爲它可以重現內部編譯器API,定期進行。

關於唯一的主要限制是它們只能訪問它們被調用的內容,或者可以從它們被調用的內容(除了一些額外的,已經存在的上下文信息)獲得它們:它們不能訪問或與任何尚不存在的東西一起工作。像類型,或者什麼名字的意思,或者表達式有什麼價值。

好吧,好的,有事情編譯插件不能這樣做宏可以:跨不同版本的編譯器穩定工作。 (還有

相關問題