遗留库中的某些子程序遵循一种丑陋但可用的状态码约定来报告错误,我使用这些状态码从我的C++代码中抛出可读的异常:这非常有效。
另一方面,有时候即使条件是可以恢复的,这个遗留库也会调用STOP(终止程序)。
我想要在C++中“捕获”这个STOP,到目前为止我还没有成功。
以下代码很简单,但确切地代表了手头的问题:
Fortran遗留库fmodule.f90:
module fmodule
use iso_c_binding
contains
subroutine fsub(x) bind(c, name="fsub")
real(c_double) x
if(x>=5) then
stop 'x >=5 : this kills the program'
else
print*, x
end if
end subroutine fsub
end module fmodule
C++接口main.cpp
:
#include<iostream>
// prototype for the external Fortran subroutine
extern "C" {
void fsub(double& x);
}
int main() {
double x;
while(std::cin >> x) {
fsub(x);
}
return 0;
}
编译命令行(GCC 4.8.1 / OS X 10.7.4;
$
表示命令提示符):$ gfortran -o libfmodule.so fmodule.f90 -shared -fPIC -Wall
$ g++ main.cpp -L. -lfmodule -std=c++11
运行:
$ ./a.out
1
1.0000000000000000
2
2.0000000000000000
3
3.0000000000000000
4
4.0000000000000000
5
STOP x >=5 : this kills the program
我该如何捕获STOP
信号,然后请求另一个数字。请注意,我不想修改Fortran代码。
我尝试过的方法:
std::atexit
:一旦进入,就无法“回来”std::signal
:似乎无法捕获STOP
信号
exit
的 C/C++ 库没有什么不同。在这种情况下,你可能能够在 FORTRAN 运行时之前挂钩 STOP 调用(如果可能的话),但从本质上讲,你要处理的代码并不是按照库应有的行为编写的。修复 FORTRAN 库可能是一条更少痛苦且易于验证的路线。 - Joeatexit
处理程序无法“返回”-请参见我的答案。 - Hristo Iliev