正如标题已经说明的那样,我正在尝试声明一个嵌套函数并返回一个指向该函数的指针.我希望这个函数'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)不会退出时才有效."
史蒂夫,你有一个完全错误的心理模型,什么是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)不会退出时才有效."