当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

setjmp与longjmp机制 很难与C++和睦相处

    “setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中,请使用C++提供的异常处理机制”。它在MSDN中的原文如下:
      setjmp and longjmp do not support C++ object semantics. In C++ programs, use the C++ exception-handling mechanism.

    这究竟是为什么?大家知道,C++语言中是基本兼容C语言中的语义的。但是为什么,在C++程序中,唯独却不能使用C语言中的异常处理机制?虽然大家都知道,在C++程序中,实际上是没有必要这么做,因为C++语言中提供了更完善的异常处理模型。但是,在许多种特殊情况下,C++语言来开发的应用程序系统中,可能采用了C语言中的异常处理机制。例如说,一个应用程序由于采用C++开发,它里面使用了C++提供的异常处理机制;但是它可能需要调用其它已经由C语言实现的程序库,而恰恰在这个被复用的程序库中,它也采用了异常处理机制。因此对于整个应用程序系统而言,它不可避免地出现了这种矛盾的局面。并且这种情况是非常多见的,也可能是非常危险的。因为毕竟,“setjmp and longjmp do not support C++ object semantics”。所以,我们非常有必要来了解它究竟为什么不会兼容。

      在本篇文章中,主人公阿愚将和程序员朋友们一起,深入探讨setjmp与longjmp机制,为什么它很难与C++和睦相处?另外还有,如果C++语言来开发的应用程序系统中,不得不同时使用这两种异常处理模型时,又如何来尽可能保证程序系统的安全?

    C++语言中使用setjmp与longjmp

      闲话少说,还是看例程先吧!代码如下:

    // 注意,这是一个C++程序。文件扩展名应该为.cpp或其它等。例如,c++setjmp.cpp
    #include <stdio.h>
    #include <setjmp.h>
    #include <stdlib.h>

    //定义一个测试类
    class MyTest
    {
    public:
    MyTest ()
    {
    printf("构造一个MyTest类型的对象\n");
    }

    virtual ~ MyTest ()
    {
    printf("析构销毁一个MyTest类型的对象\n");
    }
    };

    jmp_buf mark;

    void test1()
    {
    // 注意,这里抛出异常
    longjmp(mark, 1);
    }

    void test()
    {
    test1();
    }

    void main( void )
    {
    int jmpret;

    // 设置好异常出现时,程序的回溯点
    jmpret = setjmp( mark );
    if( jmpret == 0 )
    {
    // 建立一个对像
    MyTest myobj;

    test();
    }
    else
    {
    printf("捕获到一个异常\n");
    }
    }

      请编译运行一下,程序的运行结果如下:
      构造一个MyTest类型的对象
      析构销毁一个MyTest类型的对象
      捕获到一个异常

      上面的程序运行结果,那么到底是不是合理的呢?阿愚感到有些纳闷,这结果肯定是合乎情理的呀!从这个例程来看,setjmp和longjmp并不能破坏C++中面向对象的语义,它们之间融洽得很好呀!那么为什么会说,“setjmp and longjmp do not support C++ object semantics”。请不要着急,沉住气!继续看看其它的情况,代码如下:

    #include <stdio.h>
    #include <setjmp.h>
    #include <stdlib.h>

    class MyTest
    {
    public:
    MyTest ()
    {
    printf("构造一个MyTest类型的对象\n");
    }

    virtual ~ MyTest ()
    {
    printf("析构销毁一个MyTest类型的对象\n");
    }
    };

 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接