一些程序員認爲在另外一個函數內部定義一個函數稱爲「嵌套函數」。可是現實是它不是嵌套函數,它被視爲詞彙做用域。在C語言中,詞法做用域無效,由於編譯器沒法達到/找到內部函數的正確內存位置。程序員
C不支持嵌套函數,由於咱們沒法在C中的另外一個函數內定義一個函數。咱們能夠在一個函數內聲明一個函數,但它不是嵌套函數。編程
因爲嵌套函數定義沒法訪問周圍塊的局部變量,所以它們只能訪問包含模塊的全局變量。這樣作是爲了避免必在目錄中查找全局變量。與C中同樣,有兩個嵌套做用域:本地和全局(除此以外,內置函數)。所以,嵌套函數只有有限的用途。若是嘗試在C中使用嵌套函數,則將獲得編譯時錯誤。微信
輸出:函數
編譯時錯誤:未定義對「視圖」的引用佈局
GNU C編譯器的擴展容許聲明嵌套函數。在GCC擴展名下的嵌套函數的聲明須要以auto關鍵字爲前綴/開頭。學習
另外,gcc主要經過Trampoline實現函數嵌套功能,那麼什麼是Trampoline呢?指針
Trampoline其實就是一段存在於棧上的可執行代碼,它由運行時動態生成,經過運行棧上的這段代碼跳轉到真正的目的代碼處。視頻
至於函數嵌套爲什麼要經過Trampoline去實現,這還得從嵌套函數的特色提及,由於它可以訪問容器函數中的局部變量:blog
其中offset就是容器函數中的變量,能夠在嵌套函數中直接引用,這看起來彷佛不難實現:經過sp+offset便可輕鬆訪問容器函數的棧變量,但還有一種狀況必需要考慮,那就是嵌套函數不只僅能夠在容器函數中直接調用,還可能經過函數指針在其餘函數中間接調用,這時活動棧幀佈局跟容器函數就不同了,經過sp+offset訪問到的再也不是容器函數中的對應變量位置了,這樣就會獲得意想不到的結果。教程
Trampoline能夠有效的避免這種狀況,由於Trampoline存在於容器函數的棧上,相對於要訪問的容器函數的變量相對位置是固定的,因此無論怎麼調用嵌套函數,執行的都是棧上的Trampoline,這樣訪問到的容器函數的變量位置老是正確的。不過這要求在嵌套函數調用時容器函數不能退出,不然棧上的Trampoline可能會被覆蓋,一樣會獲得意想不到的結果。
並且若是嵌套函數中不引用容器函數中的任何變量,那麼嵌套函數會被提高爲普通函數,經過上面原理的分析,這點應該很好理解。
另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!
C語言C++編程學習交流圈子,QQ羣1030652847【點擊進入】微信公衆號:C語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍分享:
編程學習視頻分享: