VC++ __FUNCTION__的實現原理是什麼?能通過這個拿到整個的函數列表嗎?

最近發現__FUNCTION__這個神奇的東東,放在函數體里能夠獲取到函數名,於是就在想這些信息是從哪拿出來的,我想獲取整個工程或者C++源碼文件的函數列表可以從這個信息獲取到嗎?求各路大神賜教


__FUNCTION__ 是Visual C++所支持的預定義宏之一,跟__FILE__、__LINE__有點類似,但實質卻不同。

Predefined Macros - MSDN

GCC也支持__FUNCTION__:https://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

而更符合規範的寫法是 __func__ ,這在C99和C++11所支持的「預定義變數」。

請看傳送門:__func__ value difference between C and C++

__FUNCTION__及其相關的幾個「宏」都是在編譯器里特殊實現的。它們並不是真的宏,而是「預定義變數」,所以並不是在預處理(preprocessing)時展開的。

相比之下,__FILE__、__LINE__之類的宏可以很方便的在預處理時展開,可以看作是真的宏。

在做完語法分析得到抽象語法樹(AST)後,編譯器就有足夠信息知道在某個編譯單元里出現的__FUNCTION__到底位於哪個函數里,然後就可以將其展開替換為對應的函數名。

要靠它來拿到整個工程或者單個源碼文件里的所有函數定義太麻煩了。

如上面所說,關鍵就是拿到AST,於是給題主傳送門:如何寫個程序找出現有C++工程里的所有函數? - RednaxelaFX 的回答


推薦閱讀:

做編譯器的人如果遇到了bug,他們怎麼判斷是編譯器自己的問題還是編譯這個編譯器的編譯器的問題?
學習編譯原理只是研究lex和yacc嗎?
sibling call是什麼?
現在的編譯器的inline策略是怎樣的?
devcpp編譯生成一個無許可權運行的exe,並且無法再次修改編譯也無法刪除exe,如何解決?

TAG:編程 | C | VisualC | 編譯器 | 編譯 |