混合语言 F77/C++:避免破坏C++实例

Mixed language F77/C++ : Avoid destruction of C++ instance

本文关键字:C++ 实例 语言 F77 混合      更新时间:2023-10-16

我需要将Fortran和C++混合在一起。我写过C++课。我能够调用公共函数C++这要归功于调用C++库的外部"C"函数。

函数创建此C++类的一些实例。当这个函数结束时,我想将这些实例保留在内存中,以便在之后调用它们。但是销毁我的实例是自动调用的。

我不想将这些实例与 Fortran 一起使用,而是在其他包装的C++函数中使用它们。我不能使用iso_c_binding或任何Fortran 2003函数(不幸的是)。

您有什么简单的想法可以将实例保存在内存中吗?

提前谢谢。

如果要在

下次输入同一函数时再次访问相同的C++对象,则可以在函数中将它们声明为static。这将使函数的每次调用共享同一组(静态)变量。

如果多个函数需要访问同一对象,则可以在命名空间范围(在任何函数或类之外)定义它们。访问对象的函数的所有调用都将共享相同的全局变量。

如果您不希望通过使它们全局或static来隐式共享实例,最好的选择(无论如何是最好的选择)是在类周围编写一个 C 包装器,其中包含动态分配类实例的创建/销毁函数。例如:

// x.hpp
class X {
public:
    X(int);
    void foo();
};
// x_wrapper.h
extern "C" {
void* create_x(int arg);
void destroy_x(void* anX);
void x_foo(void* anX);
}
// x_wrapper.cpp
#include "x.hpp"
#include "x_wrapper.h"
void* create_x(int arg) {
    return new X(arg);
}
void destroy_x(void* anX) {
    X* self = (X*)anX;
    delete self;
}
void x_foo(void* anX) {
    X* self = (X*)anX;
    return self->foo();
}