#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
static jmp_buf env;
void longjmp1(){
printf("call longjmp1.\n");
longjmp(env, 1);
}
void longjmp2(){
printf("call longjmp2.\n");
longjmp(env, 2);
}
void init(){
int i;
i = setjmp(env);
if (i == 0){
printf("first call setjmp.\n");
longjmp1();
return;//不会运行到这里
}
else if (i == 1){
printf("second call setjmp.\n");
longjmp2();
return;
}
else if (i == 2){
printf("third call setjmp.\n");
return;
}
}
void sig_fun(int sig){
printf("call sin_fun.\n");
}
void sig(){
void(* fun_ret)(int);
fun_ret = signal(SIGTERM, sig_fun);
if (fun_ret == SIG_DFL){
printf("SIG_DFL\n");
}
else if (fun_ret == SIG_IGN){
printf("SIG_IGN\n");
}
}
void _assert(const char* str){
fprintf(stderr, "Assert Failure:\n");
fprintf(stderr, str);
abort();
}
#define STR(exp) VAL(exp)
#define VAL(exp) #exp
#define ASSERT(exp) (void)(!!(exp)||(_assert(#exp" file:"__FILE__" line:"STR(__LINE__)),0))
// ||左右必须是可判断真假的,所以左边加上!!,右边加上0
// STR(__LINE__)的展开过程:替换外层宏并传入实参VAL(1000),然后#1000 -> “1000”
int assert(){
int a = 0, b = -1;
ASSERT(1);
ASSERT(a + b);
ASSERT("abc");
ASSERT(sizeof(int) <= sizeof(char));
return 0;
}
int main(){
init();
sig();
raise(SIGTERM);
assert();
return 0;
}
setjmp.h signal.h assert.h的用法
最新推荐文章于 2025-07-06 12:40:20 发布