当前位置:  开发笔记 > 编程语言 > 正文

返回函数指针指向C中的嵌套函数

如何解决《返回函数指针指向C中的嵌套函数》经验,为你挑选了1个好方法。

正如标题已经说明的那样,我正在尝试声明一个嵌套函数并返回一个指向该函数的指针.我希望这个函数'not'返回一个新的函数指针,它将返回原始函数的否定.

这是我有的:

someType not( someType original ) {
    int isNot( ListEntry* entry ) {
        return !original( entry );
    }

    someType resultFunc = calloc( 1024, 1 );
    memcpy( resultFunc, &isNot, 1024 );

    return resultFunc;
}

someType定义为:

typedef int(*someType)(ListEntry* entry)

小智.. 19

史蒂夫,你有一个完全错误的心理模型,什么是C函数.

someType resultFunc = calloc( 1024, 1 );
memcpy( resultFunc, &isNot, 1024 );

从您的代码片段中,我可以推测您认为可以将函数的已编译代码复制到内存块中,然后重用它.这种东西闻起来像Lisp,除非在lisp中你不这样做.

实际上,当你说"&isNot"时,你会得到一个指向函数的指针.复制指针所指向的内存会产生相反的效果 - 当您将可执行文件加载到内存中时内存已初始化,并且它没有更改.在任何情况下,编写someFunc()都会导致核心转储,因为堆内存behing someFunc无法执行 - 这可以保护您免受各种病毒的侵害.

您似乎期望在C中实现闭包.实现根本就不存在.与Lisp或Perl或Ruby不同,一旦退出该帧,C就无法保留堆栈帧的元素.甚至在某些编译器中允许使用嵌套函数,我确信你不能从这些函数中引用非全局变量.封闭的东西确实是存储状态和实现operator()的C++对象,但它是一种完全不同的方法,你仍然需要手动完成.

更新:这是GCC文档的相关部分.寻找"但这种技术只有在包含函数(在本例中为hack)不会退出时才有效."



1> 小智..:

史蒂夫,你有一个完全错误的心理模型,什么是C函数.

someType resultFunc = calloc( 1024, 1 );
memcpy( resultFunc, &isNot, 1024 );

从您的代码片段中,我可以推测您认为可以将函数的已编译代码复制到内存块中,然后重用它.这种东西闻起来像Lisp,除非在lisp中你不这样做.

实际上,当你说"&isNot"时,你会得到一个指向函数的指针.复制指针所指向的内存会产生相反的效果 - 当您将可执行文件加载到内存中时内存已初始化,并且它没有更改.在任何情况下,编写someFunc()都会导致核心转储,因为堆内存behing someFunc无法执行 - 这可以保护您免受各种病毒的侵害.

您似乎期望在C中实现闭包.实现根本就不存在.与Lisp或Perl或Ruby不同,一旦退出该帧,C就无法保留堆栈帧的元素.甚至在某些编译器中允许使用嵌套函数,我确信你不能从这些函数中引用非全局变量.封闭的东西确实是存储状态和实现operator()的C++对象,但它是一种完全不同的方法,你仍然需要手动完成.

更新:这是GCC文档的相关部分.寻找"但这种技术只有在包含函数(在本例中为hack)不会退出时才有效."

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有