簡體   English   中英

C 調用嵌套 function 在另一個嵌套 function 中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM