【发布时间】:2015-09-17 15:13:25
【问题描述】:
我正在尝试使用 longjmp 在 c 中实现控制反转,目前我有这个代码:
#include <stdio.h>
#include <setjmp.h>
jmp_buf env;
int arg;
typedef void (*fptr)(int);
fptr callback;
void cb(int a)
{
arg = a;
longjmp(env, 1);
}
#define cont1(f, x) do { if(!setjmp(env)) { f(x, &cb); return; } } while(0)
void callback_func(int num, fptr cb)
{
printf("in a func, num = %d\n", num);
callback = cb;
}
void task1()
{
printf("before continuation\n");
cont1(callback_func, 7);
printf("after continuation\n");
}
void task2()
{
printf("in thread 2\n");
(*callback)(5);
}
int main()
{
task1();
task2();
printf("arg = %d\n", arg);
return 0;
}
我的问题是:这不会引发未定义的行为或可能导致实际使用中的任何问题,如果是,那么有没有更好的方法来做到这一点?
【问题讨论】:
-
肯定有办法写出比这个更清晰的代码,但是为什么你认为它会出现导致UB的错误呢?或许您可以先给我们分析一下什么是对的,什么是错的?
-
据我了解,控制权的重新反转依赖于延续,或类似的东西。尽管使用
setjmp() / longjmp()与延续有一些相似之处,但它不是等价的。我不认为 C 或其标准库有等价物。 -
@JohnBollinger:这是正确的。但是你可以使用线程构造类似的东西。
标签: c inversion-of-control undefined-behavior setjmp