我为旧版 Fortran 库准备了一个 C++ 接口。
遗留库中的一些子例程遵循丑陋但可用的状态代码约定来报告错误,我使用这样的状态代码从我的 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
似乎没有发出我可以捕捉到的信号