如何重新定义 C++ 指针函数?

How to redefine c++ pointer function?

本文关键字:函数 指针 C++ 何重新 定义      更新时间:2023-10-16

我有来自BASS库的代码。

#ifndef BASSDEF
#define BASSDEF(f) WINAPI f
#else
#define NOBASSOVERLOADS
#endif
HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);

我需要重新定义 BASSDEF 来调用 dlsym 函数。我该怎么做?

更新
我在Android NDK(Linux(上使用它,我通过函数dlopen加载了低音模块,我需要通过dlsym函数使所有函数都指向这个加载的模块(这是低音库 https://pastebin.com/Z2Ty9UsY 的原始头文件(。我需要它来轻松调用所有函数(从 bass.so 中的 JNI(模块。

实际上,BASSDEF不是一个函数。它是在编译时已知的宏。因此,让我们自己解开它:

HSAMPLE WINAPI BASS_SampleLoad(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);

哇,只是这里的函数声明。现在"WINAPI"基本上__stdcall调用约定(特定于Microsoft(。但是,查看您提供的 BASS 标头,可以找到非 WIN32 系统:

#define WINAPI

基本上,在Linux下,它只是一个占位符,可以扩展到任何内容。现在函数声明如下所示:

HSAMPLE BASS_SampleLoad(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);

下一步是什么?您想通过dlsym在某个共享库中找到此函数吗?

我假设你想要这样的东西:

// Declare a function pointer in C++11 style
using BASS_SampleLoad_FuncPtr = std::add_pointer<decltype(BASS_SampleLoad)>::type;
// Open library you wants
void* soHandle = dlopen("your_lib_here.so", RTLD_LAZY);
// Error check!
if (nullptr == soHandle) {
// Fail here
}
// Finally, get pointe to function!
BASS_SampleLoad_FuncPtr BASS_SampleLoad = reinterpret_cast<BASS_SampleLoad_FuncPtr>(dlsym(soHandle, "BASS_SampleLoad"));
// Error check!
if (nullptr == BASS_SampleLoad) {
// Fail here
}
// Now only here it's safe to call "BASS_SampleLoad" with required params
auto sample = BASS_SampleLoad(...);
...
// Don't forget to close lib
dlclose(soHandle);

请注意! 提供的代码未经测试,可能包含错误。而且,它是C++11标准。

此外,对于 C++14 及更高版本,将">std::add_pointer<...>::type"替换为">std::add_pointer_t<...>">

附言:这段代码是有效的,因为BASS是跨平台的库,所有WinAPI看起来像的东西(WINAPI,QWORD,BOOL,DWORD等(都是在BASS标头中为Linux定义的