首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言。奇异函数行为

C语言。奇异函数行为
EN

Stack Overflow用户
提问于 2014-05-12 18:04:59
回答 1查看 127关注 0票数 1

所以我正在编写一个生成函数的程序。我用GCC嵌套函数模拟lambda表达式。但我遇到了一些奇怪的程序动作。也许我不知道这背后的一些理论,巫婆领导我的程序做一些奇怪的行动。在这里,我编写了非常简单的代码,我指出了下面的问题所在。程序应该只打印N次'1337',但程序只是打印它一次,并变得疯狂。

代码语言:javascript
运行
复制
#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;
}

我想指出如果我改变了

代码语言:javascript
运行
复制
void init(void (**fn)()){
    int num = 1337;
    *fn = lambda(void,(){printf("%d\n",num);});
}

代码语言:javascript
运行
复制
void init(void (**fn)()){
    *fn = lambda(void,(){printf("%d\n",1337);});
}

它起作用了,但不能满足我的需要。

我很感激在这个问题上所提供的任何帮助或信息,因为我对此非常感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 18:50:02

正如GCC嵌套函数的文档中所指出的:

如果您试图在包含函数退出后通过它的地址调用嵌套函数,那么所有的地狱都会崩溃。如果您试图在包含作用域级别退出之后调用它,如果它引用了一些不再在作用域中的变量,那么您可能是幸运的,但冒险是不明智的。

换句话说,你在这里试图做的事情--返回一个嵌套函数的引用--并不是真正得到GCC的认可。无论它在多大程度上正确工作,你都会感到幸运,因为GCC并不打算支持这个功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23615828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档