了解C异常程序

时间:2014-07-16 18:15:52

标签: c exception

我正在努力example尝试了解函数longjmpsetjmp

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

#define TRY do{ jmp_buf ex_buf__; if( !setjmp(ex_buf__) ){
#define CATCH } else {
#define ETRY } }while(0)
#define THROW longjmp(ex_buf__, 1)

int
main(int argc, char** argv)
{
   TRY
   {
      printf("In Try Statement\n");
      THROW;
      printf("I do not appear\n");
   }
   CATCH
   {
      printf("Got Exception!\n");
   }
   ETRY;

   return 0;
}

我不理解代码开头的#define

1-什么是ex_buf__

2-在我采用这个例子的页面中,有人说:

  

执行THROW语句时,只需调用longjmp   第二个参数的函数等于1(或任何不是0)。

为什么可以取任何不是0的值?

3 个答案:

答案 0 :(得分:3)

#define指令是preprocessor指令。它用于定义预处理器使用的宏,以代码中的其他步调替换它们的调用。

例如,您有以下宏

#define TRY do{ jmp_buf ex_buf__; if( !setjmp(ex_buf__) ){

每当预处理器在代码中的其他位置看到TRY时,它就会被其内容替换。这一行

TRY

变为

do{ jmp_buf ex_buf__; if( !setjmp(ex_buf__) ){

至于你的其他问题,ex_buf__只是在TRY宏扩展创建的循环中声明(和定义)的变量。它的范围在循环内部,并且所有嵌套的范围都在循环内。

对于上一个问题,请在TRY宏中查看对setjmp的调用?它是if语句中条件语句的一部分。在函数调用之前注意感叹号!?这意味着函数的返回值被否定,即零值变为1,任何非零变为零。 longjmp函数使代码无条件地跳转到setjmp调用,并使setjmp将第二个参数的值返回longjmp。由于longjmp的第二个参数不为零,因此表达式!setjmp(...)将为零,并且代码跳转到else语句的if部分,这是CATCH try-catch模拟的一部分。

答案 1 :(得分:2)

预处理后,您的代码变为:

int
main(int argc, char** argv)
{
   do{
       jmp_buf ex_buf__;
       if( !setjmp(ex_buf__) )
       {
          printf("In Try Statement\n");
          longjmp(ex_buf__, 1);
          printf("I do not appear\n");
       }
       else
       {
           printf("Got Exception!\n");
       }
   }while(0);

   return 0;
}

jmp_buf和longjmp在setjmp.h中声明。

答案 2 :(得分:1)

ex_buf__是在jmp_buf宏中声明的TRYlongjmp只会跳转到非0值,就像if语句一样。