gpt4 book ai didi

c++ - 在库 B 中更改库 A 的函数指针

转载 作者:太空狗 更新时间:2023-10-29 21:06:47 26 4
gpt4 key购买 nike

我的情况是这样的:

我正在编写一个生成两个库的工具箱。第一个 (A) 具有所有函数和数据类型,可以在纯 C++ 应用程序中使用;第二个 (B) 是 MATLAB 的接口(interface)。一个纯 C++ 程序将被编译为

g++ $(FLAGS) C.cpp $(MOREFLAGS) -lA

而 MATLAB 程序将在 A 之后链接 B 进行编译,即

mex $(FLAGS) C.cpp $(MOREFLAGS) -lA -lB

现在,我想使用一个函数指针(myexit)来调用std::exit()用于纯 C++ 应用程序和 mex_exit() (调用 mexErrMsgTxt() )用于 MATLAB 应用程序。在函数指针教程之后,我编写了类似于下面的代码片段的内容(所有内容实际上都在命名空间内,但为了简洁起见,我已将其隐藏)。

//A.hpp
#ifndef __A
#define __A
extern void (*myexit)(int);
...
#ifdef mex_h /* defined in mex.h */
#include "B.hpp"
#endif /* mex_h */
#endif /* __A */

//A.cpp
#include "A.hpp"
void (*myexit)(int) = &std::exit;

//B.hpp
#ifndef __B
#define __B
#include <mex.h>
#include "A.hpp"
...
void mex_exit(int);
#endif /* __B */

//B.cpp
#include <mex.h>
#include "A.hpp"
void mex_exit(int err) {mexPrintf("Error code %d\n",err); mexErrMsgTxt("...");}
//void (*myexit)(int) = &mex_exit; // <- I want a line like this to override the line in A.cpp

我上面的内容似乎适用于纯 C++ 代码,我发现如果我包含行 myexit = &mex_exit;,我可以获得 MATLAB 代码的正确行为然而,在 C.cpp 中,我希望这种行为只是因为有 #include <mex.h>。和 #include "A.hpp"在 C.cpp 中并链接到 B(即包含此行不应该是用户的责任)。

这可能吗?如果是,那又如何?

最佳答案

在库B中,添加一个静态构造函数来设置myexit:

// Consider putting this into a namespace
extern void (*myexit)(int);

// anonymous namespace to avoid name collisions
namespace {
class StaticInit {
StaticInit() {
myexit = mex_exit;
}
} static_init_obj;
}

然后链接库B依赖库A:

gcc -o libB.so -shared -lA -lmatlab b.o

因为 libB 依赖于 libA,所以 libA 静态构造函数将在 libB 静态构造函数之前被调用,所以顺序不是问题。 StaticInit 构造函数将在程序启动期间(在 main() 之前)被调用,并为您设置 myexit

关于c++ - 在库 B 中更改库 A 的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com