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

How to redefine c++ pointer function?

我有来自 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 加载了低音模块,我需要使所有功能指向(这里是低音库 https://pastebin.com/Z2Ty9UsY 的原始头文件)到这个加载通过 dlsym 函数的模块。我需要它来轻松调用所有函数(从 bass.so 内部的 JNI)模块。

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

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

哇哦,这里只是函数声明。现在 "WINAPI" 基本上是 __stdcall 调用约定 (Microsoft-specific)。但是,寻找 BASS header 你提供的非 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<...>'

P.S。此代码有效,因为 BASS 是 cross-platform 库,所有 WinAPI-look-a-like 内容(WINAPI、QWORD、BOOL、DWORD 等)在 BASS header[=34 中为 Linux 定义=]