【问题标题】:Use jmp_buf in multiple file在多个文件中使用 jmp_buf
【发布时间】:2012-08-09 04:53:04
【问题描述】:

为了清楚,请查看我的示例

我有两个文件:main.cpp 和 myfunction.h

这是 main.cpp

#include <setjmp.h>
#include <myfunction.h>

int main()
{
   if ( ! setjmp(bufJum) ) {
      printf("1");
      func();
   } else {
      printf("2");
   }
   return 0;
}

这是我的函数.h

#include <setjmp.h>
static jmp_buf bufJum;

int func(){
   longjum(bufJum, 1);
}

现在,我想要我的屏幕打印“1”,然后打印“2”,但此代码不正确! 请帮我! 非常感谢!

【问题讨论】:

  • 请告诉我们实际发生了什么,而不是仅仅说它不起作用。它会崩溃吗?它什么都不输出吗?有什么,但是有什么不对吗?如果有,是什么?
  • 我很惊讶你在构建这个时没有收到错误,因为你定义了变量 bufJum 两次,拼写 longjmp 错误! 1:不要将定义放在头文件中; 2:如果要从多个源文件中访问一个变量,不要设为static; 3:避免setjmp/longjmp成为瘟疫!它不能很好地与 C++ 配合使用,如果您不非常小心,实际上会产生许多奇怪的运行时错误。
  • 另外,说“此代码不正确”不足以描述问题。 当你编译/链接/运行它时会发生什么?如果有错误消息,请将它们(逐字,即复制粘贴)添加到问题中。此外,您没有使用setjmp/longjmp多个文件,因为您将一个文件包含到另一个文件中,编译器实际上只会看到一个文件。跨度>
  • 你们都不懂我的问题!问题是“如何在多个文件中使用 setjum 和 longjmp”。 setjum 在一个文件中,longjmp 在另一个文件中。我用代码更清楚地解释了我的想法。这不是“如何正确运行我的代码”在不同的文件中使用 setjum 和 longjum 时是否可能。如果可能的话,该怎么做?对不起我的英语。
  • 虽然它在不同的文件中为你编译器将它视为唯一的一个文件,因为pre -处理器#include 指令。所以它真的不是多个文件!此外,在描述问题时,不要只说它不起作用,而是说发生了什么

标签: c++ exception-handling goto setjmp


【解决方案1】:

如果你想把它放在多个文件中,那么你需要创建两个source文件,而不是一个源文件和一个头文件

myfunction.cpp:

#include <setjmp.h>

extern jmp_buf bufJum;  // Note: `extern` to tell the compiler it's defined in another file

void func()
{
    longjmp(bufJum, 1);
}

main.cpp:

#include <iostream>
#include <setjmp.h>

jmp_buf bufJum;  // Note: no `static`

void func();  // Function prototype, so the compiler know about it

int main()
{
    if (setjmp(bufJum) == 0)
    {
        std::cout << "1\n";
        func();
    }
    else
    {
        std::cout << "2\n";
    }

    return 0;
}

如果你使用 GCC 来编译这些文件,你可以例如使用这个命令行:

$ g++ -Wall main.cpp myfunction.cpp -o myprogram

现在您有一个名为myprogram 的可执行程序,它由两个 文件组成。

【讨论】:

    【解决方案2】:

    我对setjmp一无所知,但你的代码中至少有一个错误:

    -#include <myfunction.h>
    +#include "myfunction.h"
    

    【讨论】:

    • 别提了。当您包含路径时,此代码可能会在代码块中运行。
    【解决方案3】:

    您在 .h 文件中定义了一个非内联函数。虽然不违法,但这几乎总是错误的。

    您在 .h 文件中定义了一个静态全局变量。虽然不违法,但这几乎总是错误的。

    【讨论】:

    • 对不起我的代码,但我不知道在不同文件中使用 setjmp 和 longjmp 时可能或不可能。不要提及变量。我只知道如何在不同的文件中使用 setjmp 和 longjmp。如果可能的话,该怎么做?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2021-11-07
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多