c - 如何在c中允许程序崩溃然后恢复

标签 c

我正在用 c 语言开发一些需要可变参数函数的东西,并且我需要根据每个参数的类型做一些事情。我通过here知道没有办法在执行过程中检查类型(我对他们试图在那里解决它的方式不感兴趣),所以我想知道c中是否有任何类型的 panic/recover 技术,以便实现排序try/catch(我看过 this 关于伪 try catch 的文章,但它们不允许运行不可执行的代码)。

我的想法是循环遍历变量并尝试仅适用于特定类型的不同行为。我知道这可能是不可能的。如果您知道任何事情,请先致谢

编辑:如果您建议我应该重构我的代码而不必这样做,请让我解释一下:我正在尝试实现一个 println() 函数,类似于 python 和 go 中的函数,其中您可以简单地输入要打印的所有变量,而不必担心格式字符串(println(myvar,10,“nice”))。显而易见的答案是不要这样做,因为格式字符串实际上并不那么难。但这对我来说听起来很有趣

最佳答案

传统上,可变参数函数的编写方式是可以通过先前参数的内容来预测每个参数的类型。

您无法通过反复试验可靠地确定参数的类型。调用者将参数放在堆栈上,函数需要知道堆栈上每个参数的偏移量和类型。

例如,如果您可能有两个 32 位整数或一个 64 位整数,或者一个有符号 64 位整数与一个无符号 64 位整数,您如何知道其中的区别?如果您要求,处理器会很乐意将无符号整型视为有符号整型并计算出错误的结果..不会有错误告诉您类型错误。

在您编辑的问题中,我现在看到您想要完成的任务。这种事情在Python等高级语言中很容易做到,其中所有参数都是对象,如果需要确定它们的类型,可以进行内省(introspection)。 C 不是那样的。您正在较低级别上处理数据。64 位整数实际上是 64 位内存,包含整数值。您没有元数据告诉您类型。您的代码必须知道它正在处理什么类型的数据以及它所在的位置。当参数在堆栈上传递时,您甚至无法知道传递了多少个参数或一个参数在哪里结束以及下一个参数从哪里开始,更不用说每个参数的类型了。你的函数必须知道这一切。当您处理普通(非可变)函数时,这是编译器为您处理的事情,因此您不必考虑太多。与 Python 相比,Python 中的参数位于高级列表或字典中,这为您提供了有关其包含内容的大量信息。

关于c - 如何在c中允许程序崩溃然后恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45219462/

相关文章:

c - 我想将数据插入二叉树,但在 3 个输入后显示段错误

c - 在 C 中显示文件内容 - 写访问错误

c - C 中的二维数组 malloc ---> 错误?

c - Notesearch 漏洞利用异常 (Hacking : Art of Exploitation)

c - C 总是生成相同的随机序列吗?

c - c中的“计算电路的面积和周长”程序......奇怪的输出

c - watch 描述符到底是什么? (Linux inotify 子系统)

c - VSTforward_call 在非标准调用约定上失败

c - 为什么在进行远程过程调用时 UDP 优于 TCP?

c - 带 if 的位运算符