Tag: longjmp

在setjmp.h中定义的C中的非本地跳转如何工作?

C参考手册 ,附录B描述了两个函数setjmp和longjmp用于称为非本地跳转 。 除了基本理解setjmp保存状态信息和longjmp恢复state ,我还无法理解此function的确切流程和用例。 那么,这个function到底完成了什么,它在哪里有用?

链接到C ++库时在C中使用setjmp和longjmp

我想在C程序中使用setjmp和longjmp,该程序链接到用C ++实现的库(但有一个C API)。 C ++代码确实进行了动态内存分配,指针通过API传递,但只要代码的C端正确管理那些(不透明)对象,使用longjmp时就不会有任何混乱,对吧? 我知道在C ++代码中使用这些函数是不安全的,但它是否应该在链接到C ++代码的C代码中安全?

这些破坏性变量警告有何意义?

我有这样的function: #include jmp_buf buf; void func2(int g); extern int some_global; void func(int x) { if (setjmp(buf)) return; if (some_global) x += 5; func2(x); } GCC(gcc(Debian 4.4.5-8)4.4.5)发出警告: test.c:在函数’func’中: test.c:5:警告:参数’x’可能被’longjmp’或’vfork’破坏[-Wclobbered] 为什么???? 我的意思是,显然我不在乎x是否被破坏,因为它在setjmp返回后不可能被使用。 即使编译器应该知道一些非常明显的东西,因为它具有某种特殊的setjmp知识。 我的主要兴趣是找到我inheritance的代码库中的错误,因此,“使用这种编码风格代替”并不是我正在寻找的建议。 然而,这里有许多奇怪的曲折。 例如,如果x是局部变量而不是参数,那么GCC不会抱怨。 此外, if (some_global)没有if (some_global)行,GCC不会抱怨。 尼斯。 有些事情搞砸了GCC的流量分析,或者GCC知道我不知道的事情。 所以, 是否有一种简单的方法来抑制此函数的此警告,就像将未使用的参数转换为(void) ? 或者我只是在项目范围内禁止警告? 或者我错过了什么? 更新:让我与您分享一个不会产生警告的略有不同的版本: #include jmp_buf buf; void func2(int g); extern int some_global; […]

优秀的setjmp / longjmp教程

嗨,我想在C中阅读关于setjmp / longjmp的好教程。如果有一些真实而非人为的例子会更好。 谢谢。

使用longjmp / setjmp进行Cerror handling有哪些“好”的方法?

我必须将C用于一个项目,我正在考虑使用longjmp/setjmp进行error handling,因为我认为在一个中心位置处理错误要比返回代码容易得多。 如果有一些关于如何做到这一点的线索,我将不胜感激。 如果发生任何此类错误,我特别关注正确完成资源清理。 另外,我如何处理导致multithreading程序使用它们的错误? 更好的是,是否有一些C库已经存在以进行错误/exception处理?