當前位置:編程學習大全網 - 圖片素材 - 微機原理塊嵌套不匹配

微機原理塊嵌套不匹配

壹些程序員認為在另壹個函數內部定義壹個函數稱為“嵌套函數”。但是現實是它不是嵌套函數,它被視為詞匯作用域。在C語言中,詞法作用域無效,因為編譯器無法達到/找到內部函數的正確內存位置。

C不支持嵌套函數,因為我們無法在C中的另壹個函數內定義壹個函數。我們可以在壹個函數內聲明壹個函數,但它不是嵌套函數。

由於嵌套函數定義無法訪問周圍塊的局部變量,因此它們只能訪問包含模塊的全局變量。這樣做是為了不必在目錄中查找全局變量。與C中壹樣,有兩個嵌套作用域:本地和全局(除此之外,內置函數)。因此,嵌套函數只有有限的用途。如果嘗試在C中使用嵌套函數,則將得到編譯時錯誤。

輸出:

編譯時錯誤:未定義對“視圖”的引用

GNU C編譯器的擴展允許聲明嵌套函數。在GCC擴展名下的嵌套函數的聲明需要以auto關鍵字為前綴/開頭。

另外,gcc主要通過Trampoline實現函數嵌套功能,那麽什麽是Trampoline呢?

Trampoline其實就是壹段存在於棧上的可執行代碼,它由運行時動態生成,通過運行棧上的這段代碼跳轉到真正的目的代碼處。

至於函數嵌套為何要通過Trampoline去實現,這還得從嵌套函數的特點說起,因為它能夠訪問容器函數中的局部變量:

其中offset就是容器函數中的變量,可以在嵌套函數中直接引用,這看起來似乎不難實現:通過sp+offset即可輕松訪問容器函數的棧變量,但還有壹種情況必須要考慮,那就是嵌套函數不僅僅可以在容器函數中直接調用,還可能通過函數指針在其他函數中間接調用,這時活動棧幀布局跟容器函數就不壹樣了,通過sp+offset訪問到的不再是容器函數中的對應變量位置了,這樣就會得到意想不到的結果。

Trampoline可以有效的避免這種情況,因為Trampoline存在於容器函數的棧上,相對於要訪問的容器函數的變量相對位置是固定的,所以不管怎麽調用嵌套函數,執行的都是棧上的Trampoline,這樣訪問到的容器函數的變量位置總是正確的。不過這要求在嵌套函數調用時容器函數不能退出,否則棧上的Trampoline可能會被覆蓋,同樣會得到意想不到的結果。

  • 上一篇:18歲可愛清純的美女圖片欣賞
  • 下一篇:地下城是什麽遊戲
  • copyright 2024編程學習大全網