我想使用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/

10-10 23:37