我想使用setjmp()
/longjmp()
来实现协程系统。
然后,我决定编写一个小的.c文件进行测试。在MinGW中可以。我得到了想要的结果。
但是,当我在MSVC++中编译它时,程序崩溃:“访问冲突”
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
jmp_buf a;
int is_invoke=0;
void
action_1()
{
for ( ;; ) {
printf("hello~~~A\n");
if(!setjmp(a)) {
is_invoke=1;
return;
}
}
}
void
func()
{
if (is_invoke) {
longjmp(a,1);
}
action_1();
printf("end\n");
}
void
dummy()
{
;
}
int
main(int argc, char *argv[])
{
for ( ;; ) {
func();
dummy();
}
return 0;
}
最佳答案
setjmp的手册页显示:
在一个简单的实现中,您可能假设jmp_buf
包含一个用于重置堆栈指针的地址和一个跳转至的地址。从保存jmp_buf
的函数返回后,jmp_buf
指向的堆栈帧不再有效,并且可能立即损坏。
换句话说,您只能依靠longjmp充当某种super-return
语句-永远不要更深入。
我认为这对您在mingw中有效(对于我在Linux上对我而言)是特定于实现的,并且可能是运气好的。还有另一种方式-您读过Simon Tatham's evil coroutine macros文章吗?
关于c - 为什么MinVC中没有setjmp/longjmp在MSVC上崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8628067/