簡體   English   中英

C語言。 功能異常

[英]C language. Strange function behavior

所以我正在編寫一個生成函數的程序。 我正在用GCC嵌套函數模擬lambda表達式。 但是我遇到了奇怪的程序動作。 也許我不了解這背后的理論,女巫帶領我的程序進行奇怪的動作。 在這里,我編寫了非常簡化的代碼,下面指出了問題所在。 該程序應該只打印N次'1337',但是該程序只打印一次並且發瘋。

#include <stdio.h>
#include <stdlib.h>

#define lambda(return_type, function_body) \
    ({ \
        return_type __fn__ function_body \
        __fn__; \
    })

void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

int main(){
    void (*fn)();
    init(&fn);
    fn(); // Everything is fine, it prints '1337'
    fn(); // It prints '-1869573949' , maybe accessing memory somewhere
    fn(); // It does not print anything at all
    ...   // It does not print anything at all
    return 0;
}

我想指出的是,如果我改變

void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

void init(void (**fn)()){
    *fn = lambda(void,(){printf("%d\n",1337);});
}

它有效,但是不能滿足我的需求。

感謝您提供有關此問題的幫助或信息,因為我對此非常感興趣。

正如GCC的嵌套函數文檔中所述:

如果您嘗試在包含函數退出后通過其地址調用嵌套函數,那么所有地獄都會變得松散。 如果您嘗試在包含作用域級別退出之后調用它,並且如果它引用了不再在作用域中的某些變量,則可能很幸運,但是冒險是不明智的。

換句話說,您在此處嘗試做的事情-返回對嵌套函數的引用-並未真正受到GCC的認可。 無論它在何種程度上正常運行,您都非常幸運,因為GCC並不意味着支持此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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