[英]C calling nested function inside another nested function
當我在另一個嵌套 function 中調用嵌套 function 的蹦床時,嵌套 function 的蹦床無法訪問蹦床變量,在本例中為浮點數r
。
typedef void (*callback)();
callback Wrapper(float r) {
auto void foo();
void foo() {
// do something with r.
}
return &foo;
}
int main(void)
{
callback c = Wrapper(0.1);
auto void foo2();
void foo2() {
c(); // doesn't work unless i don't use r in foo (Segmentation fault (core dumped))
}
foo2();
c(); // works fine.
return 0;
}
來自gcc 文檔嵌套函數:
如果您嘗試在包含 function 退出后通過其地址調用嵌套的 function,一切都會崩潰。
function void foo
在 function Wrapper
中定義,function foo
的地址從Wrapper
返回。 然后在 function Wrapper
退出后調用 function。 正如文檔所述,您的代碼使“一切都變得一團糟”。
將嵌套的 function 視為分配在堆棧上的變量。 當 function 返回時,嵌套的 function 不再存在。
蹦床嵌套 function 無法訪問蹦床變量,在本例中為浮點數 r。
變量r
僅在Wrapper
function 內具有 scope。一旦Wrapper
退出,變量r
停止存在。
auto void foo(); auto void foo2();
這很奇怪。 沒必要這么寫。 只需編寫 function - 默認情況下就像auto
一樣。
一旦Wrapper()
完成,您就不能使用c()
,因為它不在 scope 中。可以把它想象成 function 只在Wrapper()
執行時才存在(即使您知道它的代碼仍在某處,您也不能出於下面解釋的原因執行它,如果它不是來自包含它的 function 的內部)您在main()
的開頭調用Wrapper()
) ,並且Wrapper()
返回指向Wrapper()
本地的 function 的指針Wrapper()
。 好吧,那個指針是一個假指針,因為程序從Wrapper
返回后 function 已經不復存在了。 這就像返回一個指向局部變量的指針。
我應該說Undefined Behavior ,但是當我們談論 GCC 擴展時,該術語也不在 scope 之外,那么我能說什么呢? (正如我從 KamilCuk 的另一個答案中看到的那樣,GNU 使用術語all hell breaks loose ,這對我來說聽起來很完美)
嵌套函數的實現意味着使用顯示(指向所有嵌套函數的最近活動調用記錄的指針數組,這是在其他語言中完成的,如 Pascal、Ada 或 Modula-2)來訪問范圍標識符外部函數,就像您一樣,當您從c()
訪問float r
時,但稍后,當Wrapper
未被執行時, Wrapper()
中不存在局部變量的顯示並且對c()
的調用是錯誤的,因為很久以前就無法訪問值1.0
。
出於所有目的,您嘗試從 scope (在Wrapper()
之外)調用c()
的技巧是非法的,我不知道您為什么需要這個,但是如果您認為可以維護本地,那您就錯了資源(如Wrapper
中的參數r
,在調用使用它的 function 后返回)
我建議你看看嵌套 function 指針的數組以及編譯器如何通過顯示訪問外部 function 上的變量,通過查看嵌套函數的匯編代碼(你可以無限嵌套,並且在嵌套你再添加一個指向向量的指針)在標准 C 中沒有顯示,因為所有函數都在頂層定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.