我正在努力example尝试了解函数longjmp
和setjmp
:
#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的值?
答案 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
宏中声明的TRY
。 longjmp
只会跳转到非0值,就像if语句一样。