【发布时间】:2010-10-19 12:19:10
【问题描述】:
我正在编写需要在 Unix/Mac(使用 GCC)和 Win32(使用 mingw)上编译和运行且没有错误的代码。代码必须在各种不同的环境中运行,并且它具有我无法控制的可加载模块,因此我通常使用 setjmp() 和 signal() 保护每个模块。
我看到WIN32 有setjmp() 和signal()。代码可以移植吗,还是我需要担心?
【问题讨论】:
我正在编写需要在 Unix/Mac(使用 GCC)和 Win32(使用 mingw)上编译和运行且没有错误的代码。代码必须在各种不同的环境中运行,并且它具有我无法控制的可加载模块,因此我通常使用 setjmp() 和 signal() 保护每个模块。
我看到WIN32 有setjmp() 和signal()。代码可以移植吗,还是我需要担心?
【问题讨论】:
放心吧。 CRT 应该模拟 signal() 但 MSVC 明确提到 longjmp() 在处理程序中是不合法的,除非它处理 SIGFPE。检查你的。
SIGSEGV 的等价物是 SEH 异常,异常代码为 0xc0000005 (STATUS_ACCESS_VIOLATION)。 MSVC 编译器允许使用 __try 和 __except 关键字来捕获它们。
像这样“保护”模块的想法存在严重缺陷。您的程序状态已损坏,无法修复,您不知道它是如何变异的,因此您没有机会恢复它。继续运行可能会导致许多事故。当它死于另一个异常时,你会很幸运,让你不知道真正的问题是什么,但它更有可能只是生成长时间无法诊断的坏数据。你最好不要写这样的代码。并在此过程中解决您的移植问题。
【讨论】: